Después de una discusión con colegas sobre el uso de la palabra clave 'var' en C # 3, me pregunté qué opiniones tenían las personas sobre los usos apropiados de la inferencia de tipos a través de var.
Por ejemplo, usé vagamente var en circunstancias cuestionables, por ejemplo: -
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.
Los usos más legítimos de var son los siguientes:
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Curiosamente, LINQ parece ser un área gris, por ejemplo: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
Está claro qué resultados habrá en que será un tipo que implemente IEnumerable, sin embargo, no es del todo obvio de la misma manera que una var que declara un nuevo objeto.
Es aún peor cuando se trata de LINQ a objetos, por ejemplo: -
var results = from item in someList
where item != 3
select item;
Esto no es mejor que el equitativo foreach (elemento var en someList) {// ...} equivilent.
Aquí existe una preocupación real sobre la seguridad de los tipos, por ejemplo, si colocamos los resultados de esa consulta en un método sobrecargado que acepta IEnumerable <int> e IEnumerable <double>, la persona que llama podría pasar el tipo incorrecto sin darse cuenta.
var
no mantener la tipificación estricta, pero la pregunta es si realmente es peligroso para el tipo a no ser evidente de inmediato en la definición, algo que se magnifica cuando sobrecargas errores medios compilador no pueden ser emitidos cuando se pasa involuntariamente el tipo incorrecto de un método.
var i = 0;
== falla! var c = new CrazyFrigginLongClassName();
== ganar!
var readabilityBeDamned = true;