27

C# 4.0 が登場し、Anders Hejlsberg によるこの優れたプレゼンテーションで説明されているように、dynamic キーワードが使用されます(C# は、私が追いつくよりも速く進化しています.. var キーワードについて知る時間はあまりありませんでした)。

まだ var キーワードが必要ですか? var にできることはありますか..その動的にできないことはありますか?

var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
4

3 に答える 3

72

いいえ、それらは大きく異なります。

var「コンパイル時に変数の型を推測する」ことを意味しますが、それでも完全に静的にバインドされています。

dynamicつまり、コンパイラは利用可能な操作を認識せず、DLR は実行時に呼び出しが実際に何を意味するかを判断します。

私はdynamicめったに使用しないと思います-本当に動的な動作が必要な場合にのみ:

  • varコンパイル時にタイプミスなどをキャッチできます
  • 静的にバインドされたコードは、動的にバインドされたコードよりも常に高速に実行されます (違いがかなり小さくなったとしても)。
  • 静的にバインドされたコードは、エラーだけでなく、より多くのコンパイル時サポートを提供します。呼び出し階層を見つけることができ、リファクタリングがよりうまく機能し、Intellisense が利用可能になります。
于 2008-11-18T09:52:13.557 に答える
17

dynamic と var は、2 つのまったく異なる概念を表しています。

変数

Var は基本的に、代入ステートメントの右側の式に基づいて変数の型を判断するようコンパイラーに要求します。変数は、式の型として明示的に宣言されているかのように扱われます。たとえば、次の 2 つのステートメントは同等です。

var a = "foo";
string a = "foo";

ここで重要なのは、「var」が 100% タイプ セーフであり、コンパイル時の操作であることです。

動的

Dynamic は多くの点で var の正反対です。dynamic を使用すると、特定の変数のタイプ セーフがすべて排除されます。多くの点で型がありません。変数のメソッドまたはフィールドを呼び出すと、そのフィールドを呼び出す方法が実行時に決定されます。例えば

dynamic d = SomeOperation();
d.Foo(); // Will this fail or not?  Won't know until you run the program

ここで重要なのは、「動的」はタイプ セーフではなく、ランタイム操作であることです。

于 2008-11-18T09:53:33.993 に答える
1

はい、まだ var が必要です:

Varは、コンパイラによって型が推論される 変数です。
動的には、実行時にその型が割り当てられます

そう:

Var i = "Hello World"

そうすることで、その型が文字列型として推論されるため、インテリジェンスは、文字列が使用できるすべてのメソッドを提供します。

i.Split("/")

一方:

dynamic i = "Hello World"

コンパイラはまだどのタイプであるかを知らないため、実行時までそのタイプは推測されませんが、それでも実行できます。

i.Split("/")

ただし、必要なメソッドを呼び出すと、型が間違っていてメソッドが存在しないために失敗する可能性があります。

于 2008-11-18T09:55:14.707 に答える