Wie funktioniert das Keyword in C # var?
Wie funktioniert das Keyword in C # var?
Antworten:
Dies bedeutet, dass der Typ des deklarierten Lokals vom Compiler abgeleitet wird:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
Bemerkenswert ist , varwird nicht definiert , eine Variable eines dynamischen Typs sein. Das ist also NICHT legal:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var hat nur zwei Verwendungszwecke:
var foo = new { Bar = "bar" };Sie können nichts varanderes als Einheimische als Typ verwenden. Sie können das Schlüsselwort also nicht varzum Deklarieren von Feld- / Eigenschafts- / Parameter- / Rückgabetypen verwenden.
var foo = new Foo();ist dasselbe, wie Foo foo = new Foo();, was bedeutet , dass fooeine enthaltene FooReferenz oder eine Referenz auf ein Objekt jeden Foo Sub - Typen, nicht eine Supertyp.Foo
Dies bedeutet, dass der Datentyp aus dem Kontext abgeleitet (impliziert) wird.
Von http://msdn.microsoft.com/en-us/library/bb383973.aspx
Ab Visual C # 3.0 können Variablen, die im Methodenbereich deklariert sind, einen impliziten Typ var haben. Eine implizit typisierte lokale Variable ist stark typisiert, als hätten Sie den Typ selbst deklariert, aber der Compiler bestimmt den Typ. Die folgenden zwei Deklarationen von i sind funktional äquivalent:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var ist nützlich, um Tastatureingaben und visuelle Störungen zu vermeiden, z.
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
wird
var x = new MyReallyReallyLongClassName();
kann aber bis zu einem Punkt überbeansprucht werden, an dem die Lesbarkeit beeinträchtigt wird.
Es deklariert einen Typ basierend auf dem, was ihm bei der Initialisierung zugewiesen wurde.
Ein einfaches Beispiel ist, dass der Code:
var i = 53;
Untersucht den Typ 53 und schreibt ihn im Wesentlichen wie folgt um:
int i = 53;
Beachten Sie, dass wir zwar haben können:
long i = 53;
Dies wird mit var nicht passieren. Obwohl es kann mit:
var i = 53l; // i is now a long
Ähnlich:
var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.
Dies kann bei komplizierten Typen eine geringfügige Bequemlichkeit sein. Bei anonymen Typen ist es wichtiger:
var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name};
foreach(var j in i)
Console.WriteLine(j.ID.ToString() + ":" + j.Name);
Hier gibt es keine andere Möglichkeit zu definieren iund jals zu verwenden, varda es keinen Namen für die Typen gibt, die sie enthalten.
Haben Sie jemals gehasst, solche variablen Initialisierer zu schreiben?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
Ab C # 3.0 können Sie es also durch ersetzen
var xmlSerializer = new XmlSerialzer(typeof(int))
Ein Hinweis: Der Typ wird während der Kompilierung behoben, sodass keine Probleme mit der Leistung auftreten. Der Compiler sollte jedoch in der Lage sein, den Typ während des Erstellungsschritts zu erkennen, damit Code wie überhaupt var xmlSerializer;nicht kompiliert wird.
int i = 100;// explicitly typed
var j = 100; // implicitly typed
var ist ein "Kontextschlüsselwort" in C #, was bedeutet, dass Sie es nur implizit als lokale Variable im Kontext derselben Klasse verwenden können, in der Sie die Variable verwenden. Wenn Sie versuchen, es in einer Klasse zu verwenden, die Sie von "Main" oder einer anderen externen Klasse oder einer Schnittstelle aufrufen, wird beispielsweise der Fehler CS0825 < https://docs.microsoft.com/en-us/dotnet/ angezeigt. csharp / misc / cs0825 >
In der Dokumentation finden Sie die Hinweise, wann Sie es verwenden können und wann nicht: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -lokale Variablen # Bemerkungen >
Grundsätzlich sollten Sie dies nur verwenden, wenn Sie eine Variable mit einem impliziten Wert wie "var myValue =" Dies ist der Wert "deklarieren. Dies spart ein wenig Zeit im Vergleich zum Beispiel" Zeichenfolge ", aber meiner Meinung nach ist es nicht viel Zeit gespeichert und schränkt die Skalierbarkeit Ihres Projekts ein.
var foo = new Foo(),fookönnte vom TypFoooder eine ihrer Superklassen. Wie kann das legal sein?