http://blogs.wankuma.com/rti/archive/2007/12/25/114456.aspx
暗黙的型付け
上記のタイトルのコメントですが、思ったよりも濃い反応をいただいたため、返信が少々長くなってしまったので、1タイトルとして独立させることにしました。
前回の論点ですが「3番目のコードが有用だと思う人は、2番目のコードも許容できるのではないか?」と言う内容でした。
・・・結果、そうではないという意見が多かったように思います^^;
double amount = this.GetAmount();
this.SetAmount(amount);
var amount = this.GetAmount();
this.SetAmount(amount);
this.SetAmount(this.GetAmount());
我々が、3番目のコードを読む限りでは、this.GetAmount() から何らかの値が返ってきて、それを SetAmount() メソッドに渡しているのだと認識するかと思います。
その「何らかの値」という中間結果を amount という変数を設けて明示したものが1・2番目のコードということになります。
1番目のコードは、double 型である amount に値を代入しています。
しかし、GetAmount() が返す値は、本当に double 型なのでしょうか?
ひょっとして、キャストの不要な型を double で受け取っているのかもしれません。
このコードを見ただけでは、それはわかりません。
しかし、amount が double 型であること、そして SetAmount() メソッドに double 型の値を渡せていることは明白です。
2番目のコードは、amount の型は GetAmount() が返す型と推論されて、その型として振舞われます。
つまり2番目のコードで示す amount は「GetAmount() が返す型と同じ型」という型名だと考えることができます。
そして「GetAmount() が返す型と同じ型」に格納された値を、SetAmount() メソッドに渡せていることは明白です。
GetAmountが返す型と同じ型 amount = this.GetAmount();
this.SetAmount(amount);
3番目のコードは、2番目のコードと比較して、amount 変数を介さないという違いを除いて2番目のコードと同じ意味になります。
以上が、ソースコードの表現として、3番目のコードに近しいのは、1番目よりも2番目であろうと考えている点についての補足です。
ところで2・3番目のコードで言うところの「GetAmount() メソッドが返す型と同じ型」という解釈は、結局ところ型を常に意識しているという点で今までと何も違いは無いように感じます。
メソッド間で値を受け渡すコードを記述する際に、問題があるかどうかを調べる必要がありますが、これは上記3つのコード全てに同様です。
同時に、このことは1番目のコードで double 型だとされている amount 変数を介してデータの受け渡しができることに安心感が持てる理由でもあります。
ちなみに僕なりの ver を使うべき場面と、そうでない場面の使い分けですが、
現時点での結論
は「使えるところは使え」です。
理由は、そもそも C#3.0 の言語仕様は、使うべきところで無いところは、var が使えないように設計されていると感じるからです。
例えば、僕は for 文も下記のように書いています。
for (var i = 0; i < hoge.Count; ++i)
しかし、以下のコードのように型推論できない場合は、型を明示します。
foreach(DataGridColumn x in this.grid.Columns)
最も、ジェネリクスによるコレクションが更に主流になってくれば、上記のように書かなくてはいけないケースも少なくなって来るでしょう。
その他は、こんな感じで書いています。
var b = (byte)5;
var d = 4m;
var i = 5;
var c = (DataGridColumn)this.grid.Columns[0];
結局、var を用いる場合、用いる側(あるいは読み手)は、何に推論されるのかを知った上で書く(読む)必要があると思うのです。
これは結果的に var を用いても常に型を意識しなければならないことに変わりは無い、と言うことを示しているのではないでしょうか。
このことは、以下の x の型についても例外ではないかと思います。
var x = new { Id = GetId(), Name = GetName(), Age = GetAge() };
まあ、上記が前記事のコメント中で言うところの「脳内変換の慣れ」になってくるのだと思いますが、これは先のメソッドの受け渡しの「中間結果」で何となく皆さん鍛えられているんじゃないかなぁ、と言うのが僕の意見です。
#・・・という結論じゃ駄目ですか?^^: