プログラマーな日々

プログラマーをやっています。好きなものは、C#, TaskChute Cloud, WorkFlowy, Backlog, AWSです。

var(型推論)の乱用はやめよう

varが導入された背景

varが導入されたのは、LINQを実現するために匿名型が必要だったからです。

匿名型 (C# プログラミング ガイド)
匿名型を使用すると、あらかじめ明示的に型を定義することなく、一連の読み取り専用プロパティを単一のオブジェクトにカプセル化できるので便利です。 型名はコンパイラによって生成され、ソース コード レベルでは利用できません。 各プロパティの型はコンパイラによって推論されます。 ...

C# 3.0: LINQ の進化の過程と C# のデザインへの影響
既存の構文のままで戻り値を名前と住所にしようとすると、Name と Address のみを格納する型が存在しないという問題にすぐに行き当たります。とはいえ、該当する型を導入することによってこのクエリを記述することができます。 ...

なので、私はLINQ以外ではvarを使用せず明示的に型を指定します。

varの欠点

可読性が低下する

型を推測しながらソースコードを読むのは非効率です。

ローカル変数でしか使えない

例えば、以下のようなメソッドの場合は、戻り値の型をIEnumerableで指定する必要があります。

public IEnumerable<HogeRow> FindByKey(
       HogeDataTable dataTable,
       string key) {
       var q = from HogeRow row in dataTable.Rows
                       where row.Key == key
                       select row;

       return q;
}

書籍から引用

「プログラミング MICROSOFT LINQ」 P.625より引用

ローカルな型推論を使用するベストプラクティス
たとえ構文的には正しくても、ローカル変数宣言に対してどこでもvarを使用するのは優れた実践ではないでしょう。一般的に、やむをえないときに(たとえば、後から説明しますが、匿名型のインスタンスを保存するとき)、varキーワードを使うべきです。