可能性のある複製:
dynamic(C#4)とvarの違いは何ですか?
.NET 4.0のdynamicキーワードとvarキーワードの違いは何ですか(VS 2010)。 MSDNによると、動的の定義は次のとおりです-動的ルックアップを使用すると、メソッド、演算子、インデクサーの呼び出し、プロパティおよびフィールドへのアクセス、さらにC#の通常の静的バインディングをバイパスしてオブジェクトを呼び出すことができます動的に解決されました。
Varの定義は-ですが、暗黙的に型指定されたローカル変数は、自分で型を宣言したかのように強く型付けされますが、コンパイラが型を決定します。
これは、以下のコードコンテキストでどのように異なります。
var a1 = new A();
a1.Foo(1);
dynamic a2 = new A();
a2.Foo(1);
var
は、staticタイプが推論されることを意味します-あなたの場合、それは
A a1 = new A();
すべてのバインディングはまだ行われています全体静的に。生成されたコードを見ると、上記の宣言とまったく同じになります。
dynamic
は、a2
を使用するすべての式がコンパイル時ではなく実行時にバインドされるため、動的に動作できることを意味します。コンパイラはFoo
メソッドが存在するかどうかをチェックしません-動作は実行時に決定されます。実際、オブジェクトがIDynamicMetaObjectProvider
を実装する場合、実行時に呼び出しをどう処理するかを決定でき、anyメソッド呼び出し(または他の種類の使用)に応答します-つまり、 Foo
と呼ばれる「実際の」メソッドである必要はありません。
動的な状況で生成されたコードを見ると、コールサイトとバインダーに関係するあらゆる種類の奇妙で素晴らしいことがわかります。
var
は型推論を使用するという点で型安全です。 var a = new A();
と書くことはA a = new A();
の短縮形です。 dynamic
と宣言された変数はタイプセーフではありません。コンパイラは、呼び出したメソッドが存在することを確認するために何もしません。
var
の場合、A()にはコンパイル中に.Foo(int)
メソッドが必要です。
dynamic
の場合、そうではありません。