Declaratie-instructies

Een declaratie-instructie declareert een nieuwe lokale variabele, lokale constante of lokale referentievariabele. Als u een lokale variabele wilt declareren, geeft u het type op en geeft u de naam op. U kunt meerdere variabelen van hetzelfde type in één instructie declareren, zoals in het volgende voorbeeld wordt weergegeven:

string greeting;
int a, b, c;
List<double> xs;

In een declaratie-instructie kunt u ook een variabele initialiseren met de oorspronkelijke waarde:

string greeting = "Hello";
int a = 3, b = 2, c = a + b;
List<double> xs = new();

In de voorgaande voorbeelden wordt expliciet het type variabele opgegeven. U kunt de compiler ook het type variabele laten afleiden uit de initialisatie-expressie. Gebruik hiervoor het var trefwoord in plaats van de naam van een type. Zie de sectie Impliciet getypte lokale variabelen voor meer informatie.

Als u een lokale constante wilt declareren, gebruikt u het const trefwoord, zoals in het volgende voorbeeld wordt weergegeven:

const string Greeting = "Hello";
const double MinLimit = -10.0, MaxLimit = -MinLimit;

Wanneer u een lokale constante declareert, moet u deze ook initialiseren.

Zie de sectie Referentievariabelen voor informatie over lokale referentievariabelen .

Impliciet getypte lokale variabelen

Wanneer u een lokale variabele declareert, kunt u de compiler het type van de variabele laten afleiden uit de initialisatie-expressie. Hiervoor gebruikt u het var trefwoord in plaats van de naam van een type:

var greeting = "Hello";
Console.WriteLine(greeting.GetType());  // output: System.String

var a = 32;
Console.WriteLine(a.GetType());  // output: System.Int32

var xs = new List<double>();
Console.WriteLine(xs.GetType());  // output: System.Collections.Generic.List`1[System.Double]

Zoals in het voorgaande voorbeeld wordt weergegeven, worden impliciet getypte lokale variabelen sterk getypt.

Notitie

Wanneer u var in de ingeschakelde , null-compatibele context gebruikt en het type initialisatie-expressie een verwijzingstype is, wordt door de compiler altijd een null-verwijzingstype afgeleid, zelfs als het type initialisatie-expressie niet nullbaar is.

Een veelvoorkomend gebruik hiervan var is met een constructor-aanroepexpressie. Met het gebruik van var kunt u een typenaam niet herhalen in een variabeledeclaratie en object-instantiëring, zoals in het volgende voorbeeld wordt weergegeven:

var xs = new List<int>();

U kunt een doelexpressie new gebruiken als alternatief:

List<int> xs = new();
List<int>? ys = new();

Wanneer u met anonieme typen werkt, moet u impliciet getypte lokale variabelen gebruiken. In het volgende voorbeeld ziet u een query-expressie die gebruikmaakt van een anoniem type voor het opslaan van de naam en het telefoonnummer van een klant:

var fromPhoenix = from cust in customers
                  where cust.City == "Phoenix"
                  select new { cust.Name, cust.Phone };

foreach (var customer in fromPhoenix)
{
    Console.WriteLine($"Name={customer.Name}, Phone={customer.Phone}");
}

In het voorgaande voorbeeld kunt u niet expliciet het type variabele fromPhoenix opgeven. Het type is IEnumerable<T> maar in dit geval T een anoniem type en u kunt de naam ervan niet opgeven. Daarom moet je gebruiken var. Om dezelfde reden moet u gebruiken var wanneer u de customer iteratievariabele in de foreach instructie declareert.

Zie Impliciet getypte lokale variabelen voor meer informatie over impliciet getypte lokale variabelen.

In patroonkoppeling wordt het var trefwoord gebruikt in een var patroon.

Referentievariabelen

Wanneer u een lokale variabele declareert en het trefwoord toevoegt vóór het ref type van de variabele, declareert u een verwijzingsvariabele of een ref lokale:

ref int aliasOfvariable = ref variable;

Een referentievariabele is een variabele die verwijst naar een andere variabele, die de referent wordt genoemd. Een verwijzingsvariabele is dus een alias naar de referent. Wanneer u een waarde toewijst aan een verwijzingsvariabele, wordt die waarde toegewezen aan de referent. Wanneer u de waarde van een verwijzingsvariabele leest, wordt de waarde van de referent geretourneerd. In het volgende voorbeeld ziet u dat gedrag:

int a = 1;
ref int aliasOfa = ref a;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})");  // output: (a, aliasOfa) is (1, 1)

a = 2;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})");  // output: (a, aliasOfa) is (2, 2)

aliasOfa = 3;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})");  // output: (a, aliasOfa) is (3, 3)

Gebruik de ref toewijzingsoperator= ref om de verwijzing van een referentievariabele te wijzigen, zoals in het volgende voorbeeld wordt weergegeven:

void Display(int[] s) => Console.WriteLine(string.Join(" ", s));

int[] xs = [0, 0, 0];
Display(xs);

ref int element = ref xs[0];
element = 1;
Display(xs);

element = ref xs[^1];
element = 3;
Display(xs);
// Output:
// 0 0 0
// 1 0 0
// 1 0 3

In het voorgaande voorbeeld wordt de element verwijzingsvariabele geïnitialiseerd als een alias voor het eerste matrixelement. Vervolgens wordt ref deze opnieuw toegewezen om te verwijzen naar het laatste matrixelement.

U kunt een ref readonly lokale variabele definiëren. U kunt geen waarde toewijzen aan een ref readonly variabele. U kunt ref een dergelijke referentievariabele echter opnieuw toewijzen, zoals in het volgende voorbeeld wordt weergegeven:

int[] xs = [1, 2, 3];

ref readonly int element = ref xs[0];
// element = 100;  error CS0131: The left-hand side of an assignment must be a variable, property or indexer
Console.WriteLine(element);  // output: 1

element = ref xs[^1];
Console.WriteLine(element);  // output: 3

U kunt een verwijzing toewijzen aan een verwijzingsvariabele, zoals in het volgende voorbeeld wordt weergegeven:

using System;

public class NumberStore
{
    private readonly int[] numbers = [1, 30, 7, 1557, 381, 63, 1027, 2550, 511, 1023];

    public ref int GetReferenceToMax()
    {
        ref int max = ref numbers[0];
        for (int i = 1; i < numbers.Length; i++)
        {
            if (numbers[i] > max)
            {
                max = ref numbers[i];
            }
        }
        return ref max;
    }

    public override string ToString() => string.Join(" ", numbers);
}

public static class ReferenceReturnExample
{
    public static void Run()
    {
        var store = new NumberStore();
        Console.WriteLine($"Original sequence: {store.ToString()}");
        
        ref int max = ref store.GetReferenceToMax();
        max = 0;
        Console.WriteLine($"Updated sequence:  {store.ToString()}");
        // Output:
        // Original sequence: 1 30 7 1557 381 63 1027 2550 511 1023
        // Updated sequence:  1 30 7 1557 381 63 1027 0 511 1023
    }
}

In het voorgaande voorbeeld is de GetReferenceToMax methode een methode returns-by-ref . Het retourneert niet de maximumwaarde zelf, maar een verwijzing die een alias is voor het matrixelement dat de maximumwaarde bevat. Met Run de methode wordt een verwijzing toegewezen aan de max referentievariabele. Vervolgens wordt de interne opslag van het store exemplaar bijgewerkt door deze toe te maxwijzen aan. U kunt ook een ref readonly methode definiëren. De aanroepers van een ref readonly methode kunnen geen waarde toewijzen aan de verwijzings geretourneerde waarde.

De iteratievariabele van de foreach instructie kan een referentievariabele zijn. Zie de foreach instructiesectie van het artikel Iteratie-instructies voor meer informatie.

In prestatiekritieke scenario's kan het gebruik van referentievariabelen en retournaties de prestaties verbeteren door potentieel dure kopieerbewerkingen te voorkomen.

De compiler zorgt ervoor dat een referentievariabele de referent niet overleeft en gedurende de gehele levensduur geldig blijft. Zie de sectie Veilige contexten voor ref van de C#-taalspecificatie voor meer informatie.

Zie de ref sectie Velden van het ref artikel structuurtypen voor meer informatie over de ref velden.

scoped ref

Het contextuele trefwoord scoped beperkt de levensduur van een waarde. De scoped wijzigingsfunctie beperkt respectievelijk de ref-safe-to-escape- of safe-to-escape-levensduur tot de huidige methode. Door de scoped wijzigingsfunctie toe te voegen, wordt aangegeven dat uw code de levensduur van de variabele niet verlengt.

U kunt van toepassing zijn op scoped een parameter of lokale variabele. De scoped modifier kan worden toegepast op parameters en lokale bevolking wanneer het type een ref struct. Anders kan de scoped wijzigingsfunctie alleen worden toegepast op lokale referentievariabelen. Dit omvat lokale variabelen die zijn gedeclareerd met de ref modifier en parameters die zijn gedeclareerd met de in, ref of out modifiers.

De scoped wijzigingsfunctie wordt impliciet toegevoegd aan this methoden die zijn gedeclareerd in een struct, out parameters en ref parameters wanneer het type een ref structis .

C#-taalspecificatie

Zie de volgende secties van de C#-taalspecificatie voor meer informatie:

Zie de offertenota voor structverbeteringen op laag niveau voor meer informatie over de scoped wijzigingsfunctie.

Zie ook