25
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C#】varについて改めて調査してみる

Posted at

最初に

どうも、ろっさむです。
今回は下手したら使いどころを誤りそうな 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();

参考

25
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?