dynamic(C# 參考)

高洛峰
發布: 2016-12-13 09:13:45
原創
1333 人瀏覽過

若要了解有關 Visual Studio 2017 RC 的最新文檔,請參閱 Visual Studio 2017 RC 文件。

在透過 dynamic 類型實現的操作中,此類型的作用是繞過編譯時類型檢查, 改為在運行時解析這些操作。 dynamic 類型簡化了對 COM API(例如 Office Automation API)、動態 API(例如 IronPython 庫)和 HTML 文件物件模型 (DOM) 的存取。

在大多數情況下,dynamic 類型與 object 類型的行為是相同的。 但是,不會用編譯器對包含 dynamic 類型表達式的操作進行解析或型別檢查。 編譯器將有關該操作資訊打包在一起,並且該資訊以後用於計算運行時操作。 在此過程中,類型 dynamic 的變數會編譯到類型 object 的變數中。 因此,類型 dynamic 只在編譯時存在,在執行時則不存在。

以下範例將類型為 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 的類型為 dynamic。

上下文

dynamic 關鍵字可以直接出現或作為構造類型的組件在下列情況中出現:

在聲明中,作為屬性、字段、索引器、參數、返回值或類型約束的類型。 下面的類別定義在幾個不同的聲明中使用 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 也用執行時間類型檢查比較編譯時類型檢查。

using System;namespace DynamicExamples
{    class Program
    {        static void Main(string[] args)
        {
            ExampleClass ec = new ExampleClass();
            Console.WriteLine(ec.exampleMethod(10));
            Console.WriteLine(ec.exampleMethod("value"));            // The following line causes a compiler error because exampleMethod
            // takes only one argument.
            //Console.WriteLine(ec.exampleMethod(10, 4));

            dynamic dynamic_ec = new ExampleClass();
            Console.WriteLine(dynamic_ec.exampleMethod(10));            // Because dynamic_ec is dynamic, the following call to exampleMethod
            // with two arguments does not produce an error at compile time.
            // However, itdoes cause a run-time error. 
            //Console.WriteLine(dynamic_ec.exampleMethod(10, 4));
        }
    }    class ExampleClass
    {        static dynamic field;        dynamic prop { get; set; }        public dynamic exampleMethod(dynamic d)
        {            dynamic local = "Local variable";            int two = 2;            if (d is int)
            {                return local;
            }            else
            {                return two;
            }
        }
    }
}// Results:// Local variable// 2// Local variable
登入後複製


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板