Неявно типизированные локальные переменные (Руководство по программированию в C#)

Обновлен: Июль 2008

Локальным переменным вместо явного типа может быть задан определенный "тип" var. Ключевое слово var сообщает компилятору необходимости определения типа переменной из выражения, находящегося с правой стороны оператора инициализации. Выводимый тип может быть встроенным, анонимным, пользовательским типом или типом, определенным в библиотеке классов платформы .NET Framework. Дополнительные сведения об инициализации массивов с var см. в разделе Неявно типизированные массивы (руководство по программированию на C#).

В следующем примере показаны разные способы объявления локальных переменных с var.

// i is compiled as an int
var i = 5;

// s is compiled as a string
var s = "Hello";

// a is compiled as int[]
var a = new[] { 0, 1, 2 };

// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
    from c in customers
    where c.City == "London"
    select c;

// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };

// list is compiled as List<int>                             
var list = new List<int>();

Важно понять, что ключевое слово var не означает "вариант" и не указывает на свободную типизацию или позднюю привязку переменной. Оно просто значит, что компилятор определяет и назначает наиболее подходящий тип.

Ключевое слово var можно использовать в следующих контекстах:

  • в локальных переменных (переменных, объявленных в области действия метода), как показано в предыдущем примере;

  • в операторе инициализации for;

    for(var x = 1; x < 10; x++)
    
  • в операторе инициализации for;

    foreach(var item in list){...}
    
  • в операторе операторе using.

    using (var file = new StreamReader("C:\\myfile.txt")) {...}
    

Дополнительные сведения см. в разделе Практическое руководство. Использование явно введенных локальных переменных и массивов в выражении запроса (Руководство по программированию в C#).

var и анонимные типы

Во многих случаях использование ключевого слова var является необязательным, оно служит лишь для синтаксического удобства. Однако, когда переменная инициализируется анонимным типом, необходимо объявить переменную как var, если необходимо позже получить доступ к свойствам объекта. Этот сценарий является типичным в выражениях запроса LINQ. Дополнительные сведения см. в разделе Анонимные типы (Руководство по программированию в C#).

С точки зрения исходного кода анонимный тип не имеет имени. Поэтому, если переменная запроса инициализирована с var, то единственный способ получить доступ к свойствам в возвращенной последовательности объектов заключается в использовании var в качестве типа переменной итерации в операторе foreach.

class ImplicitlyTypedLocals2
{
    static void Main()
    {            
        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };

        // If a query produces a sequence of anonymous types, 
        // then use var in the foreach statement to access the properties.
        var upperLowerWords =
             from w in words
             select new { Upper = w.ToUpper(), Lower = w.ToLower() };

        // Execute the query
        foreach (var ul in upperLowerWords)
        {
            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
        }
    }        
}
/* Outputs:
    Uppercase: APPLE, Lowercase: apple
    Uppercase: BLUEBERRY, Lowercase: blueberry
    Uppercase: CHERRY, Lowercase: cherry        
 */

Заметки

К объявлениям неявно типизированных переменных применимы следующие ограничения.

  • var может использоваться, только если локальная переменная объявлена и инициализирована в одном операторе; переменная не может быть инициализирована значением NULL или группой метода или анонимной функцией.

  • var не может использоваться в полях в области действия класса.

  • Переменные, объявленные с помощью var, не могут использоваться в выражении инициализации. Другими словами, это допустимое выражение : int i = (i = 20); but this expression вызывает ошибку времени компиляции: var i = (i = 20);

  • В одном операторе нельзя инициализировать несколько неявно типизированных переменных.

  • Если тип с именем var находится в области действия, то ключевое слово var будет преобразовано в это имя типа и не будет обрабатываться как часть неявно типизированного объявления локальной переменной.

Использование ключевого слова var может оказаться целесообразным в выражениях запроса, где определение точного конструируемого типа переменной запроса является сложной задачей. Это может происходить во время группировки и сортировки.

Ключевое слово var удобно, когда определенный тип переменной сложно вводить с клавиатуры, либо он является очевидным, либо не повышает удобочитаемость кода. Примером подобного применения ключевого слова var служит ситуация со вложенными универсальными типами, которые используются операциях по группировке. В следующем запросе используется переменная запроса с типом IEnumerable<IGrouping<string, Student>>. При условии, что пользователи, работающие с кодом, понимают данные принципы, не возникнет никаких проблем с использованием неявной типизации для удобства и краткости.

// Same as previous example except we use the entire last name as a key.
// Query variable is an IEnumerable<IGrouping<string, Student>>
 var studentQuery3 =
     from student in students
     group student by student.Last;

Однако использование ключевого слова var может сделать код более трудным для понимания другими разработчиками. По этой причине в документации по C# ключевое слово var обычно используется только при необходимости.

См. также

Задачи

Практическое руководство. Использование явно введенных локальных переменных и массивов в выражении запроса (Руководство по программированию в C#)

Основные понятия

Выражения запросов LINQ (Руководство по программированию в C#)

Ссылки

Неявно типизированные массивы (руководство по программированию на C#)

Анонимные типы (Руководство по программированию в C#)

Инициализаторы объектов и коллекций (Руководство по программированию в C#)

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

for (Справочник по C#)

foreach, in (Справочник по C#)

Оператор using (Справочник по C#)

Другие ресурсы

Справочник по C#

LINQ

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Исправлены заявления, в которых утверждается, что при инициализации анонимных типов требуется ключевое слово var. Фактически оно требуется только в том случае, если позже будет необходим доступ к свойствам этих объектов.

Исправление ошибки содержимого.