Co oznacza „var” w C #? [duplikować]


Odpowiedzi:


161

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:

  1. Deklarowanie zmiennych wymaga mniej wpisywania, szczególnie w przypadku deklarowania zmiennej jako zagnieżdżonego typu ogólnego.
  2. Musi być używany podczas przechowywania referencji do obiektu typu anonimowego, ponieważ nazwa typu nie może być z góry znana: 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.


@cdhowie Co jeśli podczas mówiąc var foo = new Foo(), foomoże być typu Foolub któregokolwiek z jej klasy Super. Jak to może być legalne?
John Strood,

3
@Djack To nie jest legalne i tak nie jest. 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 .
cdhowie

15

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ść.


9

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

var myVar = new Connection();

daje zmienną typu Connection.


7

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ą.


5

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.


0
  • Jak sugerowała nazwa, zmienna jest zmienną bez żadnego typu danych.
  • Jeśli nie wiesz, jaki typ danych zostanie zwrócony jakąkolwiek metodą, takie przypadki są dobre przy użyciu var.
  • var jest typem niejawnym, co oznacza, że ​​system sam zdefiniuje typ danych. Kompilator wywnioskuje jego typ na podstawie wartości po prawej stronie operatora „=”.
  • int / string itp. są jawnymi typami, które zostały zdefiniowane przez Ciebie.
  • Zmienną można zdefiniować w metodzie tylko jako zmienną lokalną
  • W jednej instrukcji nie można zadeklarować i zainicjować wielu zmiennych. Na przykład var i = 1, j = 2; jest nieważny.
int i = 100;// explicitly typed 
var j = 100; // implicitly typed

0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.