Dopo una discussione con i colleghi sull'uso della parola chiave "var" in C # 3, mi chiedevo quali fossero le opinioni delle persone sugli usi appropriati dell'inferenza di tipo via var?
Ad esempio, ho usato pigramente var in circostanze discutibili, ad esempio: -
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.
Gli usi più legittimi di var sono i seguenti: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
È interessante notare che LINQ sembra essere un po 'di un'area grigia, ad esempio: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
È chiaro quali saranno i risultati nel fatto che sarà un tipo che implementa IEnumerable, tuttavia non è del tutto ovvio allo stesso modo di una var che dichiara un nuovo oggetto.
È ancora peggio quando si tratta di LINQ per gli oggetti, ad esempio: -
var results = from item in someList
where item != 3
select item;
Questo non è migliore dell'equivalente foreach (elemento var in someList) {// ...} equivalente.
C'è una vera preoccupazione per la sicurezza dei tipi qui - per esempio se dovessimo inserire i risultati di quella query in un metodo sovraccarico che accettasse IEnumerable <int> e IEnumerable <double> il chiamante potrebbe inavvertitamente passare nel tipo sbagliato.
var
non mantenere la tipizzazione forte, ma la domanda è se è pericoloso per il tipo di non essere immediatamente evidente sulla definizione, qualcosa che viene amplificato quando sovraccarichi errori medi compilatore potrebbero non essere emessi quando si passa involontariamente il tipo sbagliato di un metodo.
var i = 0;
== fallito! var c = new CrazyFrigginLongClassName();
== vinci!
var readabilityBeDamned = true;