Ответ 1

Это означает, что тип объявляемого локали будет выведен компилятором:

// 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 для объявления типов полей/свойств/параметров/возвратов.

Ответ 2

Это означает, что тип данных выводится (подразумевается) из контекста.

От 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();

но его можно переоценить до того момента, когда читаемость будет принесена в жертву.

Ответ 3

"var" означает, что компилятор определит явный тип переменной, основанный на использовании. Например,

var myVar = new Connection();

предоставит вам переменную типа Connection.

Ответ 4

Он объявляет тип, основанный на назначении ему в инициализации.

Простым примером является то, что код:

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, поскольку нет имени для типов, которые они хранят.

Ответ 5

Вы когда-нибудь ненавидели писать такие инициализаторы переменных?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

Итак, начиная с С# 3.0, вы можете заменить его на

var xmlSerializer = new XmlSerialzer(typeof(int))

Одно уведомление: Тип разрешен во время компиляции, поэтому никаких проблем с производительностью. Но компилятор должен иметь возможность обнаруживать тип во время этапа сборки, поэтому код типа var xmlSerializer; не будет компилироваться вообще.