var (справочник по C#)var (C# reference)

Начиная с Visual C# 3 переменные, объявленные в области действия метода, получают неявный "тип" var.Beginning with C# 3, variables that are declared at method scope can have an implicit "type" var. Неявно типизированные локальные переменные является строго типизированными, как если бы вы объявили тип самостоятельно, однако его определяет компилятор.An implicitly typed local variable is strongly typed just as if you had declared the type yourself, but the compiler determines the type. Следующие два объявления i функционально эквивалентны:The following two declarations of i are functionally equivalent:

var i = 10; // Implicitly typed.
int i = 10; // Explicitly typed.

Важно!

При использовании var с включенными ссылочными типами, допускающими значение NULL, всегда подразумевается ссылочный тип, допускающий значение NULL, даже если тип выражения не допускает значения NULL.When var is used with nullable reference types enabled, it always implies a nullable reference type even if the expression type isn't nullable.

Ключевое слово var обычно используется с выражениями вызова конструктора.A common use of the var keyword is with constructor invocation expressions. Использование var позволяет вам не повторять имя типа при объявлении переменной и создании экземпляра объекта, как показано в следующем примере:The use of var allows you to not repeat a type name in a variable declaration and object instantiation, as the following example shows:

var xs = new List<int>();

Начиная с C# 9.0 вы можете использовать выражение new с целевым типом в качестве альтернативы:Beginning with C# 9.0, you can use a target-typed new expression as an alternative:

List<int> xs = new();
List<int>? ys = new();

ПримерExample

В следующем примере показаны два выражения запросов.The following example shows two query expressions. В первом выражении использование var разрешено, но не является обязательным, поскольку тип результата запроса может быть задан явно как IEnumerable<string>.In the first expression, the use of var is permitted but is not required, because the type of the query result can be stated explicitly as an IEnumerable<string>. Однако во втором выражении благодаря var результат может быть коллекцией анонимных типов, и имя этого типа доступно только для компилятора.However, in the second expression, var allows the result to be a collection of anonymous types, and the name of that type is not accessible except to the compiler itself. Использование var делает создание нового класса для результата необязательным.Use of var eliminates the requirement to create a new class for the result. Обратите внимание на то, что во втором примере переменная итерации foreach``item также типизирована неявно.Note that in Example #2, the foreach iteration variable item must also be implicitly typed.

// Example #1: var is optional when
// the select clause specifies a string
string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
var wordQuery = from word in words
                where word[0] == 'g'
                select word;

// Because each element in the sequence is a string,
// not an anonymous type, var is optional here also.
foreach (string s in wordQuery)
{
    Console.WriteLine(s);
}

// Example #2: var is required because
// the select clause specifies an anonymous type
var custQuery = from cust in customers
                where cust.City == "Phoenix"
                select new { cust.Name, cust.Phone };

// var must be used because each item
// in the sequence is an anonymous type
foreach (var item in custQuery)
{
    Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}

См. такжеSee also