var (C#-Referenz)
Ab C# 3 können Variablen, die im Methodenbereich deklariert wurden, den impliziten „Typ“ var
haben. Eine implizit typisierte lokale Variable ist stark typisiert, als hätten Sie den Typ selbst deklariert. Tatsächlich legt der Compiler den Typ fest. Die folgenden beiden i
-Aktivitäten sind funktional äquivalent:
var i = 10; // Implicitly typed.
int i = 10; // Explicitly typed.
Wichtig
Wenn var
mit aktivierten Verweistypen verwendet wird, die Nullwerte zulassen, impliziert dies immer einen Verweistyp, der Nullwerte zulässt, auch wenn der Ausdruckstyp diese zulässt. Die NULL-Statusanalyse des Compilers schützt vor dem Dereferenzieren eines potenziellen null
-Werts. Wenn die Variable nie einem Ausdruck zugewiesen wird, der möglicherweise NULL ist, gibt der Compiler keine Warnungen aus. Wenn Sie die Variable einem Ausdruck zuweisen, der möglicherweise NULL ist, müssen Sie testen, ob er NULL ist, bevor Sie ihn dereferenzieren, um Warnungen zu vermeiden.
Das var
-Schlüsselwort wird häufig verwendet, wenn Konstruktoraufrufausdrücke verwendet werden. Durch die Verwendung von var
können Sie einen Typnamen in einer Variablendeklaration und Objektinstanziierung nicht wiederholen, wie im folgenden Beispiel gezeigt:
var xs = new List<int>();
Ab C# 9.0 können Sie als Alternative einen als Ziel typisierten new
-Ausdruck verwenden:
List<int> xs = new();
List<int>? ys = new();
Bei einem Musterabgleich wird das var
-Schlüsselwort in einem var
-Muster verwendet.
Beispiel
Im folgenden Beispiel werden zwei Abfrageausdrücke gezeigt. Im ersten Ausdruck in das Verwenden von var
erlaubt aber nicht erforderlich, da der Typ des Abfrageergebnisses explizit als IEnumerable<string>
angegeben werden kann. Im zweiten Ausdruck ermöglicht var
, dass das Ergebnis eine Auflistung von anonymen Typen ist und dass auf die Namen dieser Typen nicht zugegriffen werden kann. Nur der Compiler kann darauf zugreifen. Durch die Verwendung von var
wird die Voraussetzung beseitigt, eine neue Klasse für das Ergebnis erstellen zu müssen. Beachten Sie, dass die foreach
-Iterationsvariable item
im zweiten Beispiel auch implizit typisiert sein muss.
// Example #1: var is optional when
// the select clause specifies a string
string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
var wordQuery = from word in words
where word[0] == 'g'
select word;
// Because each element in the sequence is a string,
// not an anonymous type, var is optional here also.
foreach (string s in wordQuery)
{
Console.WriteLine(s);
}
// Example #2: var is required because
// the select clause specifies an anonymous type
var custQuery = from cust in customers
where cust.City == "Phoenix"
select new { cust.Name, cust.Phone };
// var must be used because each item
// in the sequence is an anonymous type
foreach (var item in custQuery)
{
Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}