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的優勢就顯現出來了