Nach einer Diskussion mit Kollegen über die Verwendung des Schlüsselworts 'var' in C # 3 fragte ich mich, wie die Meinung der Leute zu den geeigneten Verwendungen der Typinferenz über var war.
Zum Beispiel habe ich var unter fragwürdigen Umständen eher faul benutzt, zB: -
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.
Weitere legitime Verwendungen von var sind: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Interessanterweise scheint LINQ eine Grauzone zu sein, z. B.: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
Es ist klar, welche Ergebnisse sich daraus ergeben werden, dass es sich um einen Typ handelt, der IEnumerable implementiert. Es ist jedoch nicht ganz so offensichtlich, wie es sich für eine var handelt, die ein neues Objekt deklariert.
Es ist noch schlimmer, wenn es um LINQ für Objekte geht, zB: -
var results = from item in someList
where item != 3
select item;
Dies ist nicht besser als das gleichwertige foreach (var item in someList) {// ...} equivilent.
Hier besteht ein echtes Problem hinsichtlich der Typensicherheit. Wenn wir beispielsweise die Ergebnisse dieser Abfrage in eine überladene Methode einfügen, die IEnumerable <int> und IEnumerable <double> akzeptiert, übergibt der Aufrufer möglicherweise versehentlich den falschen Typ.
var
Die Typisierung ist zwar stark, aber die Frage ist wirklich, ob es gefährlich ist, wenn der Typ bei der Definition nicht sofort erkennbar ist. Dies wird vergrößert, wenn Überladungen dazu führen, dass Compilerfehler möglicherweise nicht ausgegeben werden, wenn Sie den falschen Typ unbeabsichtigt an eine Methode übergeben.
var i = 0;
== scheitern! var c = new CrazyFrigginLongClassName();
== gewinnen!
var readabilityBeDamned = true;