Po dyskusji z kolegami na temat użycia słowa kluczowego „var” w C # 3 zastanawiałem się, jakie są opinie ludzi na temat właściwego zastosowania wnioskowania typu przez var?
Na przykład dość leniwie używałem var w wątpliwych okolicznościach, np .:
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.
Bardziej uzasadnione użycie var jest następujące:
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Co ciekawe, LINQ wydaje się być trochę szarym obszarem, np .:
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
Jest oczywiste, jakie będą wyniki, ponieważ będzie to typ, który implementuje IEnumerable, jednak nie jest to całkowicie oczywiste w taki sam sposób, jak var deklarujący nowy obiekt.
Jest jeszcze gorzej, jeśli chodzi o LINQ do obiektów, np .:
var results = from item in someList
where item != 3
select item;
Nie jest to lepsze niż równoważnik foreach (var item in someList) {// ...} ekwiwalent.
Istnieje poważna obawa o bezpieczeństwo typu - na przykład, gdybyśmy umieścili wyniki tego zapytania w przeciążonej metodzie, która zaakceptowała IEnumerable <int> i IEnumerable <double>, osoba dzwoniąca mogłaby przypadkowo przekazać niewłaściwy typ.
var
ma utrzymać silną wpisywanie ale pytanie jest naprawdę, czy jest to niebezpieczne dla typu, aby nie być od razu widoczne na definicji, coś, co jest powiększony przy przeciążeniach średnie błędy kompilatora nie może być wydane, gdy nieumyślnie przekazać niewłaściwy typ sposobu.
var i = 0;
== niepowodzenie! var c = new CrazyFrigginLongClassName();
== wygraj!
var readabilityBeDamned = true;