C# 4.0では新しい型「dynamic」が導入されました。これは静的型ですが、このタイプのオブジェクトインスタンスは静的型チェックプロセスを回避できます。 ほとんどの場合、この型はオブジェクトクラスのように動作します。 コンパイル時には、動的クラスのインスタンスは任意の操作をサポートするため、オブジェクトがCOMのAPIから取るのか、IronPythonのような動的言語から取るのか、HTMLのDOMから取るのか、リフレクションから取るのか、あるいはプログラム内の他のどこかから取るかどうかを気にする必要はありません。 しかし、コードが無効な動作をした場合は実行時にエラーが検出されます。 例えば、以下のコードスニペットの例メソッドexampleMethod1はパラメータが1つしかなく、コンパイル時にec.exampleMethod1(10,4)を呼び出した際にコンパイラはそれが無効であることを識別できます。 これはコンパイルの誤りです。 2つ目の呼び出しdynamic_ec.exampleMethod1(10,4)は静的型のチェックが行われていません。 したがって、コンパイラはコンパイルエラーを報告しません。 しかし、その虫は永遠に隠れるわけではありません。 実行時に検出され、実行時例外が発生します。 static void Main(string[] args){ ExampleClass ec = 新しいExampleClass(); dynamic dynamic_ec = new ExampleClass(); dynamic_ec.exampleMethod1(10, 4); dynamic_ec.someMethod("some argument", 7, null); dynamic_ec.nonexistentMethod();
} クラス ExampleClass { public ExampleClass() { } public ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { }
} IronPythonを動的で呼び出す例は以下の通りです:
IronPython.Hostingを使用; Microsoft.scrip{filtering}tingを使用しています。 司会;
Console.WriteLine("読み込み中 random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); 動的乱数 = py。 UseFile("random.py"); Console.WriteLine(「random.py loaded!」); var items = Enumerable.Range(1, 7)。 ToArray();
(int s = 0; 10000<、 s++) { random.shuffle(items); Console.Write("シーケンス{0}: ", s); foreach(アイテム内のint i) { Console.Write("{0}"、i); } Console.WriteLine();
}
動的型のオブジェクトや式の場合、コンパイラの役割は各式が実行すべき動作をカプセル化し、実行時に保存された情報をチェックし、無効な文があればランタイム例外をトリガーします。 ほとんどの動的操作の結果の種類も動的です。 例えば、次の例でマウスポインターをtestSumにカーソル合わせると、スマートプロンプトは(ローカル変数の)動的testSumを表示します。 ダイナミック D = 1; var testSum = d + 3; マウスポインターを下のtestSumにカーソル合わせます。 System.Console.WriteLine(testSum);
タイプ変換 動的タイプのインスタンスと他のタイプのインスタンス間の移行は簡単で、開発者はダイミック振る舞いと非動的振る舞いを簡単に切り替えることができます。 任意のインスタンスは暗黙的に動的型インスタンスに変換可能です。以下の例を参照してください。 動的 d1 = 7; 動的 d2 = 「文字列」; 動的 d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses();
逆に、暗黙的変換は動的に型動的表現に適用可能です。 逆に、型動的表現は暗黙的に他の型に変換することも可能です。 int i = d1; ストリングストル = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4;
動的型パラメータに関する過負荷問題 もしメソッドが動的型のオブジェクトを渡すか、呼び出されるオブジェクトが動的型であれば、オーバーロードの判断はコンパイル時ではなく実行時に起こります。
動的言語ランタイム DLR 動的言語の実行時間は です。 NET Framework 4 Beta 1は、C#の動的型をサポートし、IronPythonやIronRubyのような動的プログラミング言語も実装する新しいAPIセットです。
COMの相互運用性 C# 4.0には、オフィスオートメーションなどの従来のCOMのAPIインターフェースとの相互運用性を向上させるいくつかの機能が含まれています。 動的型、名前付きパラメータ、オプションパラメータも改善の一部です。 多くのCOMメソッドではパラメータや返り値を型オブジェクトに設定できるため、C#のような強型型言語では多くの型の強制変換が必要です。 しかし、C# 4.0ではコンパイル時に/linkオプションを追加すると、動的型に新しい効果があります。COMインターフェースのメソッドシグネチャ内のオブジェクト型(パラメータ型またはリターン型)が動的と見なされ、多くの型変換を回避できます。 例えば、次の文はこれと対照的です。 ダイナミックは使われていません。 ((Excel.Range)Excel。 セル[1, 1])。 Value2 = 「名前」; Excel.Range range = (Excel.Range)excel. セル[1, 1];
それはダイナミックな戦いでした。 Excel。 セル[1, 1]。 値=「名前」; Excel。範囲範囲 = excel。 セル[1, 1]; |