web-dev-qa-db-ja.com

C#の動的vs var

可能性のある複製:
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);
52
Bhaskar

varは、staticタイプが推論されることを意味します-あなたの場合、それは

A a1 = new A();

すべてのバインディングはまだ行われています全体静的に。生成されたコードを見ると、上記の宣言とまったく同じになります。

dynamicは、a2を使用するすべての式がコンパイル時ではなく実行時にバインドされるため、動的に動作できることを意味します。コンパイラはFooメソッドが存在するかどうかをチェックしません-動作は実行時に決定されます。実際、オブジェクトがIDynamicMetaObjectProviderを実装する場合、実行時に呼び出しをどう処理するかを決定でき、anyメソッド呼び出し(または他の種類の使用)に応答します-つまり、 Fooと呼ばれる「実際の」メソッドである必要はありません。

動的な状況で生成されたコードを見ると、コールサイトとバインダーに関係するあらゆる種類の奇妙で素晴らしいことがわかります。

93
Jon Skeet

varは型推論を使用するという点で型安全です。 var a = new A();と書くことはA a = new A();の短縮形です。 dynamicと宣言された変数はタイプセーフではありません。コンパイラは、呼び出したメソッドが存在することを確認するために何もしません。

25

varの場合、A()にはコンパイル中に.Foo(int)メソッドが必要です。

dynamicの場合、そうではありません。

14
Oded