W C #, jak działa słowo kluczowe var?
W C #, jak działa słowo kluczowe var?
Odpowiedzi:
Oznacza to, że typ deklarowanego lokalnego zostanie wywnioskowany przez kompilator na podstawie jego pierwszego przypisania:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
W szczególności varnie definiuje zmiennej jako typu dynamicznego. Więc to NIE jest legalne:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var ma tylko dwa zastosowania:
var foo = new { Bar = "bar" };Nie możesz używać varniczego poza lokalnymi. Dlatego nie można używać słowa kluczowego vardo deklarowania typów pól / właściwości / parametrów / zwracanych.
var foo = new Foo();jest tym samym Foo foo = new Foo();, co oznacza, że foomoże zawierać Fooodniesienie lub odniesienie do obiektu dowolnego Foo podtypu , a nie Foo supertypu .
Oznacza to, że typ danych jest wyprowadzany (domniemany) z kontekstu.
Z http://msdn.microsoft.com/en-us/library/bb383973.aspx
Począwszy od programu Visual C # 3,0, zmienne zadeklarowane w zakresie metody mogą mieć typ niejawny var. Niejawnie wpisana zmienna lokalna jest silnie wpisana, tak jakbyś sam zadeklarował typ, ale kompilator określa typ. Następujące dwie deklaracje i są funkcjonalnie równoważne:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var przydaje się do wyeliminowania pisania na klawiaturze i szumów wizualnych, np.
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
staje się
var x = new MyReallyReallyLongClassName();
ale może być nadużywany do tego stopnia, że traci się czytelność.
Deklaruje typ na podstawie tego, co jest mu przypisane podczas inicjalizacji.
Prostym przykładem jest to, że kod:
var i = 53;
Przeanalizuje typ 53 i zasadniczo przepisze to jako:
int i = 53;
Zauważ, że chociaż możemy mieć:
long i = 53;
To się nie stanie z var. Chociaż może z:
var i = 53l; // i is now a long
Podobnie:
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.
Może to być niewielką wygodą w przypadku skomplikowanych typów. Jest to ważniejsze w przypadku typów anonimowych:
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);
Tutaj nie ma innego sposobu definiowania ii jużywania, varponieważ nie ma nazwy dla typów, które posiadają.
Czy kiedykolwiek nie lubiłeś pisać takich zmiennych inicjalizatorów?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
Tak więc, zaczynając od C # 3.0, możesz go zastąpić
var xmlSerializer = new XmlSerialzer(typeof(int))
Jedna uwaga: Typ jest usuwany podczas kompilacji, więc nie ma problemów z wydajnością. Jednak kompilator powinien być w stanie wykryć typ podczas etapu kompilacji, więc taki kod w var xmlSerializer;ogóle się nie kompiluje.
int i = 100;// explicitly typed
var j = 100; // implicitly typed
var jest „kontekstowym słowem kluczowym” w języku C #, co oznacza, że można go używać tylko jako zmiennej lokalnej niejawnie w kontekście tej samej klasy, w której jest używana zmienna. Jeśli spróbujesz użyć go w klasie, którą wywołujesz z „Main” lub innej zewnętrznej klasy, lub na przykład interfejsu, pojawi się błąd CS0825 < https://docs.microsoft.com/en-us/dotnet/ csharp / misc / cs0825 >
Zobacz uwagi o tym, kiedy możesz, a kiedy nie możesz go używać w dokumentacji tutaj: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -local-variable # uwagi >
Zasadniczo powinieneś tego używać tylko wtedy, gdy deklarujesz zmienną z niejawną wartością, taką jak "var myValue =" To jest wartość "; Oszczędza to trochę czasu w porównaniu z powiedzeniem na przykład" ciąg ", ale IMHO nie ma dużo czasu zapisane i ogranicza skalowalność projektu.
var foo = new Foo(),foomoże być typuFoolub któregokolwiek z jej klasy Super. Jak to może być legalne?