varって便利そうだけど、使い方を誤りやすい臭いがプンプンする。
ということで改めて調べて整理してみた。
#var とは
VB等でお馴染みのVariant型ですが、C#にも var というキーワードがあります。
var patientName = "山田太郎"; // stringとして扱われる
C#における var は、VBにおけるVariant型とは違って、コンパイル時に型の評価が行われます。
なので、以下のようなVBではコンパイルエラーとならないコードも、
Dim a, b
a = 1
b = "2"
Debug.Print a + b // 3
a = "1"
b = 2
Debug.Print a + b // 3
a = "1"
b = "2"
Debug.Print a + b // 12
C# で同様のコードを書くと、コンパイルエラーとなります。
var a = 1;
var b = "2";
a = "1"; // エラー 型 'string' を型 'int' に暗黙的に変換できません
b = 2; // エラー 型 'int' を型 'string' に暗黙的に変換できません
a = "1"; // エラー 型 'string' を型 'int' に暗黙的に変換できません
b = "2";
#var を使うべきシーン
例えば以下のようなコードがあるとします。
Dictionary<string, List<StringBuilder>> stringToBuilderMap = new Dictionary<string, List<StringBuilder>>();
上記は Dictionary<string, List<StringBuilder>> という型の「stringToBuilderMap」という変数を初期化しています。このように、
- 単なる初期化なのにきわめて長いコードになる場合
- 長い文字数の同じ型を2回も書かなければいけないような場合
は、人間の目には非常に冗長なコードとなり、読みやすさを損ねることがあります。
このような場合に var を使うことで可読性を損ねることなく問題を解消できることがあります。
以下は同じ内容のコードを var を使って書いています。
var stringToBuilderMap = new Dictionary<string, List<StringBuilder>>();
つまり、右辺で初期化が行われ かつ その変数の型が人間の目から見て自明な場合が、
var の使いどころであると言えます。
決して手抜きで var を使用して、可読性を損ねるような使い方をしないようにしましょう。
なので、以下のようなコードでは var は使うべきではないです。
var targetInfo = GetTargetInfo(); // 何の型かわからない
また、私は以下のような場合でも var を使わないようにしています。
var ptid = "00001"; // 手抜きしないで string って書こうよ
変数の型が代入の右側を見て明らかである場合等はむしろ var を使えとの旨がMSDNのコーディング規約にありました。
なので今後は、型が明確に読み取れる場合は基本的に var を使っていこうと思います。
※ @HazakuraKeitaさん、ご指摘ありがとうございました。
var id = "00001";
#その他の注意点
var を使って宣言する変数は初期化されなければいけない。
var a; // コンパイルエラー
なので、var の複数宣言もできません。
var a, b; // コンパイルエラー