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