2007年12月28日

C#3.0:varの是非

  
「R.Tanaka.Ichiro's Blog」暗黙的型付け(その4)

で話題になっていた、varの是非だけれど、
var num = 10;

とか
for (var i = 0; ..

と書くべきかについては、型が明らかなんだから、使ってもいいんじゃない。
というのが僕の考え。
変数 i を、double だと誤解する人はいないだろう。ましてや、i をクラスのオブジェクトを格納する変数だと誤解する人は絶対ないと思う。

ただ、int と書くのがすでに体に染みついているので無意識に int とタイプしちゃう
から、現実的には varは使わないと思う。
でも、以下のような場合は、間違いなくvarを使うと思う。

IEnumerable<Person> query = persons.Where(p => p.Age >= 40);

じゃなくて、
var query = persons.Where(p => p.Age >= 40);


もちろん、クエリ式にしたときもvarを使います。
var query = from p in persons
where p.Age >= 40
select p;


大きな理由は特に無いけど、単にそのほうが楽だし、それで特に困ることもないから。
最初にあげたintをvarにする2つの例は、varと書くことで「楽」にはならないけど、
LINQのコードは、varが圧倒的に楽です。
まあ、人間楽なほうに流れるってことですかね。

とうぜん、この後に続く foreachでもvarを使います。
foreach (var p in query) {
Console.Writeline(p.Name);
}

あえて理由をつけるとすれば、varの方が、後からの変更に強いコードになるってこと
でしょうか?

var query = from p in persons
where p.Age >= 40
select new { p.Name, p.PhoneNo };

と、匿名クラスを返すように変更したときでも、コードを変更する必要が無いですからね。
IEnumerable って書いちゃうと変更が面倒です。
「決定はできるだけ後に延ばせ」っていう原則は、こんな時も生きてきます。というのが僕の考え。


この記事へのコメント
var は抽象型とか推論される型というよりも、代入元の型に依存する型という意味で、代入元依存型とでも表現した方が、いらぬ誤解を受けないように思うんですよね。
Posted by R・田中一郎 at 2007年12月29日 09:05
なるほど、確かにそうですね。
推論というとなんかあやふやな部分が残っているような感じもうけますしね。

Posted by Gushwell at 2007年12月29日 09:53
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51320195