C#3で 'var'キーワードの使用について同僚と話し合った後、varを介した型推論の適切な使用についての人々の意見はどうだったのでしょうか。
たとえば、私は疑わしい状況でvarを怠惰に使用しました。例:-
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.
varのより正当な用途は次のとおりです。
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
興味深いことに、LINQは少し灰色の領域のようです。例:-
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
IEnumerableを実装する型であることは、結果がどのようになるかは明らかですが、新しいオブジェクトを宣言するvarと同じように完全には明らかではありません。
オブジェクトへのLINQに関しては、さらに悪い例です。
var results = from item in someList
where item != 3
select item;
これは、同等のforeach(var item in someList){// ...}同等のものと同じです。
ここで型の安全性について本当の懸念があります。たとえば、IEnumerable <int>とIEnumerable <double>を受け入れるオーバーロードされたメソッドにそのクエリの結果を配置すると、呼び出し元が誤って間違った型を渡す可能性があります。
var
は強い型付けを維持しますが、問題は、型が定義上すぐに明らかにならないことが危険であるかどうかです。オーバーロードは、誤った型をメソッドに誤って渡したときにコンパイラエラーが発行されないことを意味する場合に拡大されます。
var i = 0;
==失敗!var c = new CrazyFrigginLongClassName();
==勝つ!
var readabilityBeDamned = true;