Возможный дубликат:
Использование ключевого слова var в С#
В С# как работает ключевое слово var
?
Возможный дубликат:
Использование ключевого слова var в С#
В С# как работает ключевое слово var
?
Это означает, что тип объявляемого локали будет выведен компилятором:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
Примечательно, что var
не определяет переменную динамического типа. Поэтому это НЕ является законным:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var
имеет только два вида использования:
var foo = new { Bar = "bar" };
Вы не можете использовать var
как тип ничего, кроме локальных. Таким образом, вы не можете использовать ключевое слово var
для объявления типов полей/свойств/параметров/возвратов.
Это означает, что тип данных выводится (подразумевается) из контекста.
От http://msdn.microsoft.com/en-us/library/bb383973.aspx
Начиная с Visual С# 3.0, переменные, объявленные в рамках метода, могут имеют неявный тип var. неявно типизированная локальная переменная строго набрали, как если бы вы объявили тип самостоятельно, но компилятор определяет тип. после двух деклараций я функционально эквивалентный:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var
полезен для устранения клавиатуры и визуального шума, например,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
становится
var x = new MyReallyReallyLongClassName();
но его можно переоценить до того момента, когда читаемость будет принесена в жертву.
"var" означает, что компилятор определит явный тип переменной, основанный на использовании. Например,
var myVar = new Connection();
предоставит вам переменную типа Connection.
Он объявляет тип, основанный на назначении ему в инициализации.
Простым примером является то, что код:
var i = 53;
Будет изучать тип 53 и, по сути, переписать это как:
int i = 53;
Обратите внимание, что хотя мы можем иметь:
long i = 53;
Это не произойдет с var. Хотя это возможно:
var i = 53l; // i is now a long
Аналогично:
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.
Это может быть незначительное удобство со сложными типами. Это более важно с анонимными типами:
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);
Здесь нет другого способа определить i
и j
, чем использовать var
, поскольку нет имени для типов, которые они хранят.
Вы когда-нибудь ненавидели писать такие инициализаторы переменных?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
Итак, начиная с С# 3.0, вы можете заменить его на
var xmlSerializer = new XmlSerialzer(typeof(int))
Одно уведомление: Тип разрешен во время компиляции, поэтому никаких проблем с производительностью. Но компилятор должен иметь возможность обнаруживать тип во время этапа сборки, поэтому код типа var xmlSerializer;
не будет компилироваться вообще.