LINQ での明らかな使用以外に、var
読みやすくするために毛むくじゃらの変数宣言を省略するためにも使用します。
var d = new Dictionary<string, Dictionary<string, Queue<SomeClass>>>();
一般的に、私は静的型付けから一種の快適さを得て (より良い言葉が欲しいのですが)、静的型付けをあきらめたくありません。変数を宣言しているときに自分が何をしているのかを知っているという感覚が好きです。変数を宣言することは、コンパイラに何かを伝えるだけでなく、コードを読んでいる人に何かを伝えることです。
例を挙げましょう。を返すメソッドがあるとしますList<string>
。このコードは確かに正しく、C# 開発者の 90% がおそらくこのように書くと思います。
List<string> list = MyMethod();
もちろんですよね?実際、ここに同じように簡単に使用できる場所がありますvar
。
十分に真実です。しかし、このバージョンのコードは単に変数を宣言しているのではなく、それを書いた人が何をしようとしているのかを教えてくれます:
IEnumerable<string> list = MyMethod();
そのコードを書いた開発者は、「私はこのリストを変更するつもりはありませんし、そのメンバーにアクセスするためにインデックスを使用するつもりもありません。私がやろうとしているのは、それを繰り返し処理することだけです」と言っています。これは、1 行のコードで理解できる大量の情報です。使ったら諦めるものですvar
。
もちろん、最初から使っていなかったとしても、あきらめているわけではありません。あなたがそのようなコード行を書くような開発者であれば、var
そこを使用しないことはすでにわかっています。
編集:
Jon Skeet の投稿を読み直したところ、Eric Lippert からの次の引用が目に飛び込んできました。
暗黙的に型付けされたローカル変数は、方法を強調せずに何を強調するかを示す小さな方法の 1 つにすぎません。
実際には多くの場合、暗黙的な型付けを使用すると、暗黙的なものを残していると思います。何にこだわらなくても大丈夫です。たとえば、次のような LINQ クエリをさりげなく記述します。
var rows = from DataRow r in parentRow.GetChildRows(myRelation)
where r.Field<bool>("Flag")
orderby r.Field<int>("SortKey")
select r;
私がそのコードを読んだとき、私がそれを読んでいるときに思うことの 1 つは、「rows
はIEnumerable<DataRow>
. LINQ クエリが返すものは であることがわかっているためIEnumerable<T>
、選択されているオブジェクトのタイプをすぐに確認できます。
それは、何が明示されていないかというケースです。それは私が推測するために残されています。
さて、私が LINQ を使用するケースの約 90% では、これはほんのわずかでも問題になりません。90% の確率で、コードの次の行は次のようになります。
foreach (DataRow r in rows)
rows
しかし、次のように宣言すると非常に便利なコードを想像するのは難しくありませんIEnumerable<DataRow>
。多くの異なる種類のオブジェクトがクエリされているコードで、クエリ宣言を繰り返しの隣に置くことは現実的ではなく、次のようになります。rows
IntelliSense で検査できると便利です。そして、それはどのようにではなく、何をするかです。