動的 (C# リファレンス)

高洛峰
リリース: 2016-12-13 09:13:45
オリジナル
1334 人が閲覧しました

Visual Studio 2017 RC の最新ドキュメントについては、「Visual Studio 2017 RC ドキュメント」を参照してください。

動的型を通じて実装された操作では、この型の役割は、コンパイル時の型チェックをバイパスし、代わりに実行時にこれらの操作を解決することです。動的タイプを使用すると、COM API (Office Automation API など)、動的 API (IronPython ライブラリなど)、および HTML ドキュメント オブジェクト モデル (DOM) へのアクセスが簡素化されます。

ほとんどの場合、動的型はオブジェクト型と同じように動作します。 ただし、動的型の式を含む操作は、コンパイラによって解析または型チェックされません。 コンパイラはこの操作に関する情報をパッケージ化し、この情報は後で実行時の操作を計算するために使用されます。 このプロセス中に、dynamic 型の変数は object 型の変数にコンパイルされます。 したがって、動的型はコンパイル時にのみ存在し、実行時には存在しません。

次の例では、dynamic 型の変数と object 型の変数を比較します。 コンパイル時に各変数の型を確認するには、WriteLine ステートメントの dyn または obj の上にマウス ポインターを置きます。 IntelliSense は、 dyn の「ダイナミック」と obj の「オブジェクト」を表示します。

class Program
    {        static void Main(string[] args)
        {            dynamic dyn = 1;            object obj = 1;            // Rest the mouse pointer over dyn and obj to see their
            // types at compile time.
            System.Console.WriteLine(dyn.GetType());
            System.Console.WriteLine(obj.GetType());
        }
    }
ログイン後にコピー

WriteLine ステートメントは、 dyn と obj のランタイム型を表示します。 この時点では、両方とも同じ整数型になります。 次の出力が生成されます:

System.Int32

System.Int32

dyn と obj の違いを確認するには、前の例の宣言と WriteLine ステートメントの間に次の行を追加します。

dyn = dyn + 3;  
obj = obj + 3;
ログイン後にコピー

式 obj + 3 に整数とオブジェクトを追加しようとした場合のコンパイラ エラーを報告します。 ただし、dyn + 3 エラーは報告されません。 dyn は動的タイプであるため、dyn を含む式はコンパイル時にチェックされません。

Context

動的キーワードは、次の状況で直接、または構築された型のコンポーネントとして出現できます:

宣言内で、プロパティ、フィールド、インデクサー、パラメーター、戻り値、または型として制約タイプ。 次のクラス定義では、いくつかの異なる宣言で Dynamic を使用しています。

class ExampleClass
    {        // A dynamic field.
        static dynamic field;        // A dynamic property.
        dynamic prop { get; set; }        // A dynamic return type and a dynamic parameter type.
        public dynamic exampleMethod(dynamic d)
        {            // A dynamic local variable.
            dynamic local = "Local variable";            int two = 2;            if (d is int)
            {                return local;
            }            else
            {                return two;
            }
        }
    }
ログイン後にコピー

明示的な型変換で、変換のターゲット型として。

 static void convertToDynamic()
        {            dynamic d;            int i = 20;
            d = (dynamic)i;
            Console.WriteLine(d);            string s = "Example string.";
            d = (dynamic)s;
            Console.WriteLine(d);

            DateTime dt = DateTime.Today;
            d = (dynamic)dt;
            Console.WriteLine(d);

        }        // Results:
        // 20
        // Example string.
        // 2/17/2009 9:12:00 AM
ログイン後にコピー

型が値として機能するコンテキスト (is 演算子や as 演算子の右側など)、または typeof の引数として構築された型の一部であるコンテキスト。 たとえば、次の式では、dynamic を使用できます。

        int i = 8;            dynamic d;            // With the is operator.
            // The dynamic type behaves like object. The following
            // expression returns true unless someVar has the value null.
            if (someVar is dynamic) { }            // With the as operator.
            d = i as dynamic;            // With typeof, as part of a constructed type.
            Console.WriteLine(typeof(List<dynamic>));            // The following statement causes a compiler error.
            //Console.WriteLine(typeof(dynamic));
ログイン後にコピー

次の例では、複数の宣言でdynamicを使用しています。 Main は、実行時の型チェックとコンパイル時の型チェックも使用します。

りー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート