Effective C# 3rd 読書メモ 01 暗黙的に型付けされたローカル変数を好む

「暗黙的に型付けされたローカル変数」とは?

varキーワードを使ったローカル変数の定義のこと。

Dictionary<string, string> dict = new Dictionary<string, string>();

よりも

var dict = new Dictionary<string, string>();

の方を推奨している。

なぜvarの使用が推奨されるのか?

最も実利的な理由は、LINQの結果がIQueryable<T>なこともあればIEnumerable<T>なこともあるから。
もう1つの理由は、コードが短く、読みやすくなり、コードの意味に集中しやすくなるから。

また、開発者が誤った型を使用することで発生する問題を回避しやすくなる。
例:

public IEnumerable<string> FindCustomersStartingWith(string start)
    IEnumerable<string> q = from c in db.Customers
                            select c.ContactName;
    var q2 = q.Where(s => s.StartsWith(start));
    return q2;
}

上記コードは、「指定した文字列で始まる顧客名のリストを取得する」という仕様は満たしているが、パフォーマンス上の問題を抱えている。
qはIEnumerable<string>として宣言されているため、メソッドの3行目のq.Where()Queryable.Where()ではなく、Enumerable.Where()が実行される。
そのため、DBから全ての顧客の名前を取得してから、Enumerable.Where()で絞り込む、という、効率の悪い処理が実行されてしまう。

var q = from c in db.Customers
        select c.ContactName;

のように、varを使用すれば、コンパイラがqの適切な型を推論してくれるので、qの型はIQueryable<string>になる。Queryable.Where()を使うと、絞り込みはDBで実行されるため、DBから取得するデータは最小限で済む。

varを使うべきでない場合

数値の演算等、暗黙的な型変換によるエラーが発生しうる場合には、明示的に型を指定すべき。
また、varの使用によって可読性が損なわれる場合にも使用を避けたほうがよい。

var f = GetMagicNumber();
var total = 10 * f / 6;

だと、ftotalの型が何になるか確認するには、GetMagicNumber()のシグネチャを確認する必要がある。
さらに、GetMagicNumber()Int32を返す場合など、演算によって情報が失われる場合もある。
このような場合には、以下のように明示的に型を宣言したほうがよい。

double f = GetMagicNumber();
double total = 10 * 6 / f;

まとめ

ローカル変数はvarを使って宣言したほうが良い
ただし、コードの意図を理解するのに宣言された型を知る必要がある場合を除く
(具体的には、数値型は全て明示的に型を宣言することを推奨する)

コメントをどうぞ

コメントを残す