読者です 読者をやめる 読者になる 読者になる

ぎじぶろ

技術資料をまとめていくブログ

var をいつ使うのか

C# コーディング

C# の var。色々と便利だが、どう使うのが一番いいのか。
使っていいシーンと使うとダメなシーンを考えてみる。

var (C# リファレンス)
https://msdn.microsoft.com/ja-jp/library/bb383973.aspx

暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)
https://msdn.microsoft.com/ja-jp/library/bb384061.aspx

そもそもvar とは?

リファレンスによると
「var キーワードは、初期化ステートメントの右側の式から変数の型を推測することをコンパイラに指示します。」
とある。

var i = 10; // i はint型で扱われる
var s = "hoge"; // s はstring型で扱われる

10とか"hoge"を見てから、コンパイラ側で i と s をint型、string型に定義してくれる。
なんでもいけるから変数を定義する時は便利。

var をどういうシーンで使うのが良いのか?

new を使ってインスタンスを生成するタイミングが良いのでは?という感想。
たとえば、以下のような場合

Dictionary<int, string> dicHoge = new Dictionary<int, string>();

Dictionary型で生成したdicHoge、右側で new Dictionary() でインスタンスを生成している。
こういった場合は左側をvarにすることで、冗長化しているコードを少しだけ短くすることができる。

var dicHoge = new Dictionary<int, string>();

こっちの方がすっきりして見やすくなる。

どういうシーンで使ってはいけない?

構文の意味も同じでコードを短くできるんだから何でもvar を使うのがいいのかと感じてしまうが、
「可読性」の観点から見づらいコードができてしまう可能性がある。

1.関数の中を見ないと型が分からないもの
以下の場合、右側の関数を見た場合に何の型で返ってくるかわからない。

var userInfo = GetUserInfo(userId);

2.何の型でforeachをしているかわからない
foreach でもvarを使うことができるが、一体何の型を使っているかわからない。

foreach (var u in userInfoMap) {
    // userInfoMap がforeach の近くで定義されているならいいが、
    // 突然 userInfoMap が出てきたら何のことかよく分からない
}

最後に

var は便利だけれども、可読性が下がる可能性も秘めている。
「右側の式を見て型が明らかである場合は var を使う」
というイメージでいいのかなと思った。