Pytanie Co oznacza "var" w C #? [duplikować]


Możliwe duplikaty:
Używanie słowa kluczowego var w języku C # 

W języku C #, w jaki sposób słowo kluczowe "var"praca?


76
2017-11-29 19:54


pochodzenie




Odpowiedzi:


Oznacza to, że deklarowany typ lokalny zostanie wywnioskowany przez kompilator:

// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";

Szczególnie, var nie 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:

  1. Wymaga mniejszego pisania w celu zadeklarowania zmiennych, szczególnie gdy deklarujesz zmienną jako zagnieżdżony rodzajowy typ.
  2. Musi być używany podczas przechowywania odniesienia do obiektu typu anonimowego, ponieważ nazwa typu nie może być znana z góry: var foo = new { Bar = "bar" };

Nie możesz użyć var jako typ niczego poza miejscowymi. Więc nie możesz użyć słowa kluczowego var zadeklarować typy pola / właściwości / parametru / zwrotu.


139
2017-11-29 19:56



Jest to dobry przykład tego, jakie odpowiedzi powinny być podobne do wymiany stosu. Czasami ludzie pomijają ważne informacje i / lub nie są krótkie i na temat. - Panzercrisis
@cdhowie Co jeśli mówiąc, var foo = new Foo(), foo może być typu Foo lub którejkolwiek z jego superklas. Jak to może być legalne? - John Strood
@Djack To nie jest legalne, a tak nie jest. var foo = new Foo(); to jest to samo co Foo foo = new Foo();, co oznacza że foo może zawierać Foo odniesienie lub odniesienie do dowolnego obiektu Foo  podrodzaj, nie za Foo  Wspaniałyrodzaj. - cdhowie


Oznacza to, że typ danych pochodzi (domyślnie) z kontekstu.

Od http://msdn.microsoft.com/en-us/library/bb383973.aspx

Zaczynając od Visual C # 3.0, zmienne   zadeklarowane w zakresie metody mogą   mieć domyślny typ var. Na   niejawnie wpisana zmienna lokalna to   mocno napisany tak, jakbyś miał   zadeklarował typ sam, ale   kompilator określa typ. The   po dwóch deklaracjach i   funkcjonalnie równoważny:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

var jest przydatny do eliminowania pisania na klawiaturze i szumów wizualnych, np.

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();

staje się

var x = new MyReallyReallyLongClassName();

ale można go nadużywać do punktu, w którym czytelność jest poświęcana.


12
2017-11-29 19:55





"var" oznacza, że ​​kompilator określi typ jawny zmiennej na podstawie użycia. Na przykład,

var myVar = new Connection();

dałoby ci zmienną typu Connection.


7
2017-11-29 19:56





Czy kiedykolwiek nienawidziłeś pisać takich inicjalizatorów zmiennych?

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 rozwiązywany podczas kompilacji, więc nie ma problemów z wydajnością. Ale kompilator powinien być w stanie wykryć typ podczas etapu kompilacji, więc koduj jak var xmlSerializer; w ogóle się nie skompiluje.


4
2017-11-29 20:05





Deklaruje typ w oparciu o to, co jest mu przydzielone podczas inicjalizacji.

Prostym przykładem jest to, że kod:

var i = 53;

Przeanalizuję typ 53 i zasadniczo przerobię to na:

int i = 53;

Zwróć uwagę, że chociaż możemy:

long i = 53;

Nie stanie się to w przypadku var. Choć 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ć niewielka wygoda w przypadku skomplikowanych typów. Ma to większe znaczenie w przypadku anonimowych typów:

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 i i j niż używanie var ponieważ nie ma nazwy dla typów, które posiadają.


4
2017-11-29 20:05