新しい 'dynamic' C#4.0キーワードは 'var'キーワードを廃止しますか?
-
08-07-2019 - |
質問
C#4.0が登場し、この Anders Hejlsbergによる優れたプレゼンテーションで説明されているように、動的キーワードがある場合(C#は私が追いつくことができるよりも速く進化しています。.varキーワードに慣れる時間はあまりありませんでした)
まだvarキーワードが必要ですか? varでできることはありますか?。
var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
解決
いいえ、それらは非常に異なっています。
var
は、「コンパイル時に変数の型を推測する」という意味です。 -しかし、それはまだ完全に静的にバインドされています。
dynamic
は、「この変数を使って何でもできると仮定する」という意味です。 -つまり、コンパイラは利用可能な操作を認識せず、DLRは実行時に本当に呼び出しが意味することを解決します。
dynamic
を使用することはほとんどありません-動的な動作が本当に必要な場合のみ:
-
var
を使用すると、コンパイル時にタイプミスなどをキャッチできます - 静的にバインドされたコードは、動的にバインドされたコードよりも常に速く実行されます(違いがかなり小さくなった場合でも)
- 静的にバインドされたコードは、エラーだけでなく、より多くのコンパイル時サポートを提供します:呼び出し階層を見つけることができ、リファクタリングがよりうまく機能し、Intellisenseが利用可能です
他のヒント
Dynamicとvarは、まったく異なる2つのアイデアを表しています。
var
Varは、基本的にコンパイラに、代入文の右側の式に基づいて変数の型を把握するように依頼します。変数は、式の型として明示的に宣言されたかのように処理されます。たとえば、次の2つのステートメントは同等です
var a = "foo";
string a = "foo";
ここで取り上げる鍵は、「var」 100%タイプセーフであり、コンパイル時の操作です
動的
動的は、多くの点でvarの正反対です。動的を使用すると、特定の変数に対するすべての型安全性が本質的になくなります。多くの方法で型がありません。変数のメソッドまたはフィールドを呼び出すと、そのフィールドを呼び出す方法の決定は実行時に行われます。例
dynamic d = SomeOperation();
d.Foo(); // Will this fail or not? Won't know until you run the program
ここで取り上げる鍵は、「動的」ということです。タイプセーフではなく、実行時操作です
はい、まだ変数が必要です:
Var は、コンパイラによって型が推測される変数です。
動的には、実行時にそのタイプが割り当てられます
だから:
Var i = "Hello World"
そのタイプは文字列型として推測されるため、インテリジェンスは文字列が使用できるすべてのメソッドを提供します
i.Split("/")
場所:
dynamic i = "Hello World"
実行時まで型が推測されることはありません。なぜなら、コンパイラはまだどの型であるかを知らないからです。 <*>
ただし、型が間違っていてメソッドが存在しないため、必要なメソッドを呼び出すと失敗する場合があります。