После обсуждения с коллегами относительно использования ключевого слова 'var' в C # 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;
Это не лучше, чем эквивалентный foreach (var item в someList) {// ...} эквивалентный.
Здесь существует реальная проблема безопасности типов - например, если бы мы поместили результаты этого запроса в перегруженный метод, который принимал IEnumerable <int> и IEnumerable <double>, вызывающая сторона могла бы непреднамеренно передать неправильный тип.
var
действительно поддерживает строгую типизацию, но вопрос в том, действительно ли опасно, чтобы тип не был сразу очевиден при определении, что усиливается, когда перегрузки означают, что ошибки компилятора могут не возникать, когда вы непреднамеренно передаете неправильный тип методу.
var i = 0;
== провал! var c = new CrazyFrigginLongClassName();
== победить!
var readabilityBeDamned = true;