asp.net C#中dynamic的用法

來源:互聯網
上載者:User

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變數是一個object變數這一點,可以通過il代碼得到驗證,這裡不再貼出il代碼。當然,編譯器也對dynamic聲明進行了處理,以區別直接object變數。

dynamic是做為簡化互通性而被msdn中大肆渲染,我感覺正是基於這一點,才被部分開發人員誤解:因為很多開發人員不會接觸com+、office二次開發之類的編碼,所以急需要一個dynamic的應用理由。那麼,在日常開發中,我認為dynamic很有價值的一點是:

於dynamic變數是一個object變數這一點,可以通過il代碼得到驗證,這裡不再貼出il代碼。當然,編譯器也對dynamic聲明進行了處理,以區別直接object變數。
dynamic是做為簡化互通性而被msdn中大肆渲染,我感覺正是基於這一點,才被部分開發人員誤解:因為很多開發人員不會接觸com+、office二次開發之類的編碼,所以急需要一個dynamic的應用理由。那麼,在日常開發中,我認為dynamic很有價值的一點是:

於dynamic變數是一個object變數這一點,可以通過il代碼得到驗證,這裡不再貼出il代碼。當然,編譯器也對dynamic聲明進行了處理,以區別直接object變數。 dynamic是做為簡化互通性而被msdn中大肆渲染,我感覺正是基於這一點,才被部分開發人員誤解:因為很多開發人員不會接觸com+、office二次開發之類的編碼,所以急需要一個dynamic的應用理由。那麼,在日常開發中,我認為dynamic很有價值的一點是:

dynamic可以簡化反射。

以前我們這樣使用反射:

    public class dynamicsample
    {
        public string name { get; set; }

        public int add(int a, int b)
        {
            return a + b;
        }
    }
            dynamicsample dynamicsample = new dynamicsample();   //create instance為了簡化示範,我沒有使用反射
            var addmethod = typeof(dynamicsample).getmethod("add");
            int re = (int)addmethod.invoke(dynamicsample, new object[] { 1, 2 });

現在,我們有了簡化的寫法:

            dynamic dynamicsample2 = new dynamicsample();
            int re2 = dynamicsample2.add(1, 2);


我們可能會對這樣的簡化不以為然,畢竟看起來代碼並沒有減少多少,但是,如果考慮到效率兼優美兩個特性,那麼dynamic的優勢就顯現出來了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.