この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 18548|答える: 0

[出典] C# 4.0におけるダイナミックの利用

[リンクをコピー]
掲載地 2016/07/07 10:23:00 | | |
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];




先の:MVCアジャックス。 BeginForm() ページは非同期で送信されます
次に:同じ識別子値を持つ別のオブジェクトはすでに...
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com