Неявно типизированные переменные и анонимные типы (ключевое слово var)

Часто, при исследовании кода C# можно встретить рядом с переменной не её тип, например, int, string и т.д., а ключевое слово var. В зависимости от контекста, ключевое слово var может использоваться в C# в двух случаях, которые мы рассмотрим в этой части

Что означает var в C#?

Ключевое слово var может означать то, что перед нами неявно типизированная переменная, либо то, что перед нами анонимный тип. Неявно типизированные переменные и анонимные типы появились в C# 3.0 и активно используются в программировании. В некоторых случаях, ключевое слово var позволяет нам значительно сократить объявление переменной и сделать код более лаконичным и понятным.

Неявно типизированные переменные

Язык C# — это язык со статической (строгой) типизацией. Тип переменной определяется один раз на этапе объявления переменной и не может изменяться в последствии.

Неявно типизированная переменная — это переменная, тип которой выводится компилятором, исходя из выражения, стоящего справа от переменной. Например,

var i = 1; //тип переменной int
var s = "string"; //тип переменной string

Чтобы убедиться, что переменным i и s действительно присвоен соответствующий их значениям тип, достаточно в Visual Studio навести курсор на ключевое слово var:

неявно типизированная переменная var в C#
Неявно типизированная переменная

Изменить тип переменной мы не можем. Например, следующий код приведет к ошибке:

var s = "string"; //тип переменной string
s = 2;
Ошибка CS0029 Не удается неявно преобразовать тип «int» в «string».

Таким образом, использование неявно типизированных переменных в C# позволяет сократить количество ввода. Ни смены типа переменной в процессе выполнения приложения, ни каких-либо других возможностей, в данном случае, мы не получаем. При этом, забегая немного вперед, стоит отметить, что при использовании того же LINQ, часто бывает намного проще использовать ключевое слово var для объявления переменной, чем выписывать её тип самостоятельно.

Где могут использоваться неявно типизированные переменные (var)?

Использование неявно типизированных переменных имеет свои ограничения. Например, мы можем использовать неявно типизированные переменные в качестве локальных переменных в методах. Также, мы можем использовать их в циклах:

for (var i = 1; i < 10; i++)
{
    Console.WriteLine(i);
}

В данном случае, справа от var i стоит число 1, что позволяет компилятору вывести тип (int) и выполнить цикл. В цикле foreach также допустимо использование var:

var list = new List<string>();
list.Add("Привет");
list.Add("мир");
foreach (var item in list) 
{
    Console.WriteLine(item);
}

Здесь в цикле тип переменной item определен, исходя из типа элементов в списке (string).

Где запрещено использование неявно типизированных переменных (var)?

Неявно типизированные переменны запрещено использовать:

1) в качестве возвращаемого методом результата:

public var Method()
{
    
}

3) в параметрах методов:

public void Method(var i) 
{ 
}

3) в свойствах классов:

public class MyClass
{
    public var Name { get; set; }
}

Во всех приведенных выше случаях мы получим ошибку:

Контекстное ключевое слово «var» может использоваться только в объявлении локальной переменной или в скрипте.

4) в выражениях, где тип переменной невозможно определить

Например, в выражении ниже:

var n = null;

в итоге, получим ошибку:

Ошибка CS0815 Не удается присвоить неявно типизированной переменной.

Анонимные типы

Анонимный тип — это тип имя которого создается компилятором и недоступно на уровне исходного кода. Отсюда, видимо и название — «анонимный тип», т.е. тип, не имеющий названия для использования в исходном коде. Использование анонимных типов — это тот самый момент, когда использование ключевого слова var не только оправдано, но и является единственно возможным.

Анонимный тип создается с использованием ключевого слова new:

var anon = new { Name = "Вася", Age = 25 };
Console.WriteLine($"Имя {anon.Name} Возраст {anon.Age}");

Все свойства анонимных типов доступны только для чтения. Например, мы не можем написать так:

var anon = new { Name = "Вася", Age = 25 };
anon.Name = "Петя";
Ошибка CS0200 Невозможно присвоить значение свойству или индексатору «.Name» — доступ только для чтения.

Анонимные типы активно используются при работе с LINQ. Например, при создании проекций с использованием методов Select или SelectMany. Также, анонимный тип пожет использоваться в случае, когда необходимо использовать какой-либо объект, инкапсулирующий набор свойств, в узком контексте или же вообще единожды в коде. Создавать для этого отдельный тип данных — излишне.

Итого

Ключевое слово var может использоваться в двух случаях: для определения неявно типизированной переменной и для определения анонимного типа. При этом, единственно необходимым случаем использования var является второй случай — для анонимного типа, имя которого недоступно из исходного кода. В случае же неявно типизированных переменных var используется не более, чем синтаксическое удобство, позволяющее сделать код более кратким.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии