ダイナミックはFrameWork4.0の新機能です。 Dynamic の出現により、C# に弱い言語型の特性が与えられます。コンパイラはコンパイル中に型をチェックしなくなり、コンパイル時のデフォルトの動的オブジェクトは必要な機能をすべてサポートします。たとえば、GetDynamicObject メソッドによって返されるオブジェクトについて何も知らない場合でも、次のようにコードを呼び出すことができ、コンパイラはエラーを報告しません:
dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(dynamicObject.Name); Console.WriteLine(dynamicObject.SampleMethod());
正しい使用法と言えば、まず間違いを指摘する必要があります。使用法:
人々はよくキーワード var を Dynamic と比較します。実際、var と Dynamic は完全に異なる概念であり、一緒に比較すべきではありません。 Var は実際にはコンパイル時にスローされる「構文糖」であり、コンパイルされると、コンパイル時に var 変数の実際の型と自動的に照合され、変数の宣言が実際の型に置き換えられます。実際の型を使用して宣言されます。 Dynamic をコンパイルすると、実際にはオブジェクト型になりますが、コンパイラは動的型に対して特別な処理を実行するため、コンパイル中に型チェックを実行せず、実行時に型チェックを行います。
これは、Visual Studio のエディター ウィンドウから見ることができます。 var で宣言された変数は、Visual Studio が var 型の実際の型を推論できるため、「インテリジェント センシング」をサポートしますが、dynamic で宣言された変数は、コンパイラがその実行時の型について何も知らないため、「インテリジェント センシング」をサポートしません。動的変数に対して「Intelligence Sense」を使用すると、「この操作は実行時に解決されます」というプロンプトが表示されます。
動的変数がオブジェクト変数であるという事実は、IL コードを通じて確認できます。IL コードはここには掲載されません。もちろん、コンパイラは直接オブジェクト変数を区別するために動的宣言も処理します。 MSDN では、相互運用性を簡略化する方法として
ダイナミックが非常に誇張されていますが、これが一部の開発者によって誤解されているためだと思います。多くの開発者が COM+ や OFFICE の二次開発に慣れていないためです。動的なアプリケーションの緊急の必要性。したがって、日々の開発において、動的について最も価値があることは次のとおりだと思います:
型変換
動的型のインスタンスと他の型のインスタンス間の変換は非常に簡単で、開発者は動的と非動的間の切り替えを簡単に組み合わせることができます。行動。任意のインスタンスは暗黙的に動的型のインスタンスに変換できます。次の例を参照してください。
dynamic d2 = "a string"; = System.Diagnostics.Process.GetProcesses();
逆に、暗黙的な変換は、dynamic 型の式に動的に適用できます。
逆に、dynamic 型の式は、他の型に暗黙的に変換することもできます。
int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;
メソッド内の動的型パラメータのオーバーロードの問題
If が呼び出された場合 Ifメソッドに動的型のオブジェクトが渡されるか、呼び出されるオブジェクトが動的型である場合、オーバーロードの判断はコンパイル時ではなく実行時に行われます。
動的言語ランタイム (動的言語ランタイム DLR)
動的言語ランタイムは、.NET Framework 4 Beta 1 の新しい API セットです。これは、C# の動的型のサポートを提供し、IronPython や動的プログラミング言語などのツールも実装します。アイアンルビーみたいに。
dynamic はリフレクションを簡素化できます。
以前は、次のようにリフレクションを使用していました:
public class DynamicSample { public string Name { get; set; } public int Add(int a, int b) { return a + b; } } DynamicSample dynamicSample = new DynamicSample(); //create instance为了简化演示,我没有使用反射 var addMethod = typeof(DynamicSample).GetMethod("Add"); int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
今は、簡略化された書き方があります:
dynamic dynamicSample2 = new DynamicSample(); int re2 = dynamicSample2.Add(1, 2);
このような単純化にはあまり感動しないかもしれませんが、結局のところ、コードはあまり削減されないようです。 , しかし、効率と優雅さ、機能の両方を考慮すると、ダイナミックの利点が現れます。コンパイラーは動的に最適化します。これは、キャッシュを使用しないリフレクションよりもはるかに高速です。比較する必要がある場合は、上記の 2 つのコード (Add メソッドを呼び出す部分) を 1,000,000 回実行して、結論を導き出すことができます。