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 max
wijzen 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 struct
is .
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.