dynamic(C# 參考)

來源:互聯網
上載者:User

若要瞭解有關 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
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.