После обсуждения с коллегами относительно использования ключевого слова 'var' в С# 3 я задавался вопросом, какие мнения людей были в соответствующих случаях использования вывода типа через var?
Например, я довольно лениво использовал var в сомнительных обстоятельствах, например: -
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.
Более законные применения var следующие: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Интересно, что LINQ кажется немного серой областью, например: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
Понятно, какие результаты будут в том, что это будет тип, который реализует IEnumerable, однако это не совсем очевидно так же, как var, объявляющий новый объект.
Это еще хуже, когда речь идет о LINQ для объектов, например: -
var results = from item in someList
where item != 3
select item;
Это не лучше, чем equivalent foreach (элемент var в someList) {//...} equivilent.
Здесь существует серьезная проблема безопасности типов - например, если бы мы поставили результаты этого запроса в перегруженный метод, который принял IEnumerable <int> и IEnumerable <double> вызывающий может непреднамеренно передать неправильный тип.
var
действительно поддерживает сильную типизацию, но вопрос в том, действительно ли это опасно для типа, чтобы он не сразу проявлялся в определении, то, что увеличивается при перегрузках, означает, что ошибки компилятора могут не выдаваться, когда вы непреднамеренно передаете неправильный тип метод.