最初に
どうも、ろっさむです。
今回は下手したら使いどころを誤りそうな var
について、今後の自分のためにも改めて調査し、まとめていこうと思います。
varとは
みんな大好き「型推論」を行う際に使用するキーワードが**var
**です。これはC#3.0から追加された機能です。
コンパイラから見て、初期化値から変数の型がわかる場合にはvar
を用いて、コンパイル時にコンパイラに型を推測させることができます。このようなローカル変数を**「暗黙的型指定ローカル変数」**といいます。
// int型
var iNum = 1;
// float型
var fNum = 2.5;
// string型
var str = "hoge";
// Dictionary<string, List<int>>型
var myList = new Dictionary<string, List<int>>();
ListやDictionary等のような初期化で二回書くのが面倒臭い冗長なコードに対して、var
は効果を発揮します。
そんな便利なvar
ですが使いどころを誤ると可読性が損なわれかねません。
varが使えない箇所
- プロパティ
- グローバル変数
- nullでの初期化を行う変数の宣言(ただしnull許容参照型を有効にして使用することはできる…)
- 初期化式を使用する変数(例:
var i = (i = 10)
)
varの適材適所
var
キーワードはMicrosoftではコンストラクタ内で使用することを推奨しています。これは単にコンストラクタ内で初期化を行うのが一般的だからでしょう。
- 右辺の型が明確な時
// これはOK
var myList = new Dictionary<string, List<int>>();
// これはGetMyListが何の型を返してくるのかぱっと見でわからない
var myList2 = GetMyList();
上記の、メソッドからの返り値を格納するためのローカル変数にvarを使うのはMicrosoftのコーディング規約ではNGとなっています。ただ、チームで使用しているIDEが決まっている(例えばVisual Studio, Riderなど)場合は、そのIDEがvar変数の型を適宜表示してくれる機能があるので、優先すべきはチームでのコーディング規約かと思います。
- foreachなどのループ用変数の型を指定
var IDs = new List<int>();
foreach (var id in IDs)
{
// なにかしらの処理
}
- クエリ式を使用する時
string[] colors = { "red", "blue", "green", "white", "black" };
var wordQuery = from word in colors
where word[0] == 'w'
select word;
new 式
こちらはC#9.0以降の新しい機能となります。
詳しくはまた別の記事でまとめて紹介しようと思いますが、さらっと解説します。
var
は左辺の型を暗黙的に推論するために使用するキーワードでしたが、この「new式」は右辺に対して働きます。式の中の変数の型がわかっている場合には**、初期化用の型の方を省略する**ことができます。
List<int> ids = new();