Após uma discussão com os colegas sobre o uso da palavra-chave 'var' no C # 3, perguntei-me qual seria a opinião das pessoas sobre os usos apropriados da inferência de tipo via var?
Por exemplo, usei preguiçosamente var em circunstâncias questionáveis, por exemplo: -
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.
Os usos mais legítimos de var são os seguintes: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Curiosamente, o LINQ parece ser um pouco de uma área cinzenta, por exemplo: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
Está claro quais serão os resultados, pois será um tipo que implementa IEnumerable, no entanto, não é totalmente óbvio da mesma maneira que um var que declara um novo objeto.
É ainda pior quando se trata de LINQ para objetos, por exemplo: -
var results = from item in someList
where item != 3
select item;
Isso não é melhor que o equivalente foreach (var item em someList) {// ...}.
Há uma preocupação real com a segurança do tipo aqui - por exemplo, se colocarmos os resultados dessa consulta em um método sobrecarregado que aceite IEnumerable <int> e IEnumerable <double>, o chamador poderá inadvertidamente passar para o tipo errado.
var
não manter a tipagem forte, mas a questão é realmente se é perigoso para o tipo de não ser imediatamente aparente na definição, algo que é ampliada quando sobrecargas erros do compilador médios não pode ser emitido quando você involuntariamente passar o tipo errado para um método.
var i = 0;
== falha! var c = new CrazyFrigginLongClassName();
== ganhar!
var readabilityBeDamned = true;