私は暗黙のタイピングに慣れていないので、主な違いを教えてください。
var foo = new Love();
と
object foo = new Love();
私は暗黙のタイピングに慣れていないので、主な違いを教えてください。
var foo = new Love();
と
object foo = new Love();
最初のケースでは、 のタイプはfoo
ですLove
。2 番目の場合は ですobject
。
var foo = new Love();
ここで、変数の静的foo
型はLove
. と同等Love foo = new Love();
です。
object foo = new Love();
ここで、変数の静的foo
型はobject
. 最初にキャストを使用しないと、Love のメソッドにアクセスできません。
の動的型 (または実行時型)foo
はLove
両方の場合にあるため、両方に対してGetType
返さLove
れます。
を使用var
すると、コンパイルは代入演算子の右側の式に基づいて変数の型を推測します。
言い換えると、
var foo = new Love();
とまったく同等です
Love foo = new Love();
したがって、 のすべてのメンバーは-Love
を介して利用できますが、タイプが であると宣言されている場合は、 、、およびにしかアクセスできません。foo
foo
object
GetHashCode()
ToString()
GetType()
Equals()
では、( C# 4 でのvar
使用とは対照的に) 静的型付けを引き続き使用しています。dynamic
変数の型を明示的に述べているわけではありません-コンパイラーにそれを解決させています。ただし、コンパイラが処理できる型である必要があります。たとえば、これらはすべて無効です。
// All invalid
var a = null;
var b = delegate() { Console.WriteLine("Hello"); };
var c = x => Console.WriteLine("lambda: " + x);
var d = MethodName; // Attempted method group conversion
これらの場合、コンパイラは、どのタイプを意味するかを判断するのに十分な情報を持っていません。
var foo = new Love();
ここでは等しい
Love foo = new Love();
var
長いクラス名を避けるために使用できる場合があります。たとえばDictionary<string,Dictionary<int,string>>.
、クラス Love のすべてのメソッド/プロパティを使用できます。
object foo = new Love();
これで、foo はオブジェクトと見なされます。クラス Love のメソッド/プロパティは表示されませんが、元に戻すことはできます。