Смысл var в том, чтобы разрешить анонимные типы, без него они были бы невозможны, и именно по этой причине он существует. Все остальные варианты использования я считаю ленивым кодированием.
Помимо упомянутого вами аспекта удобочитаемости, 'var' также имеет преимущество уменьшения вероятности того, что простое изменение кода нарушит другие части вашего кода. Если вы переименуете тип, например. Или, если вы переключитесь на другой тип, который в основном совместим с предыдущим типом (например, переход с Foo [] на IEnumerable), у вас будет гораздо меньше работы, чтобы вернуть свой код обратно в компилируемое состояние.
Вы можете абстрагироваться от умственной сложности технических деталей и сосредоточиться исключительно на проблемной области своей модели. вы должны убедиться, что ваши переменные названы осмысленно.
Использование var
в качестве переменной итератора для блока foreach является более безопасным по типу, чем явные имена типов. Например,
class Item {
public string Name;
}
foreach ( Item x in col ) {
Console.WriteLine(x.Name);
}
Этот код может компилироваться без предупреждений и по-прежнему вызывать ошибку приведения во время выполнения. Это связано с тем, что цикл foreach работает как с IEnumerable
, так и с IEnumerable
. Первый возвращает значения, набранные как объект
, а компилятор C # просто выполняет приведение к Item
за вас. Следовательно, это небезопасно и может привести к ошибкам выполнения, поскольку IEnumerable
может содержать объекты любого типа.
С другой стороны, следующий код выполнит только одно из следующих
x
типизирован для объекта
или другого типа, у которого нет поля имени / property Типом «x» будет объект
в случае IEnumerable
и T
в случае IEnumerable
. Компилятор не выполняет преобразование.
foreach ( var x in col ) {
Console.WriteLine(x.Name);
}
Мне это нравится, особенно в модульных тестах, потому что по мере развития кода мне нужно только исправить правую часть объявления/назначения. Очевидно, что я также должен обновить, чтобы отразить изменения в использовании, но в момент объявления мне нужно внести только одно изменение.
Он не производит значимых изменений в излучаемом IL. Это просто предпочтение стиля кода.
Мне, например, это нравится, особенно когда речь идет о типах, которые имеют длинные, общие, почти нечитаемые имена, такие как Dictionary
.
Никаких реальных различий нет. Некоторые предлагают использовать явный тип, потому что это может упростить сопровождение кода. Однако люди, которые настаивают на var
, придерживаются позиции, что «если мы используем var, мы вынуждены использовать хорошие соглашения об именах».
Конечно, если вы используете vars с намерением иметь хорошие соглашения об именах, а это ломается, в будущем это будет более болезненно.(IMO)
var
- это просто синтаксический сахар. Во время компиляции всегда известно, к какому типу относится переменная. Других преимуществ использования ключевого слова var нет.
public IAwesome { string Whatever { get; } }
public SoCool : IAwesome { public string Whatever { get; } }
public HeyHey
{
public SoCool GetSoCool() { return new SoCool(); }
public void Processy()
{
var blech = GetSoCool();
IAwesome ohYeah = GetSoCool();
// Now blech != ohYeah, so var is blech and ohYeah is IAwesome.
}
}