先來看看dynamic的乙個例子:
可能你會說,這個效果,我用object關鍵字就可以了,幹嗎加個dynamic?那我們就來討論一下object與dynamic的區別。
先看如下**:
但是這樣就有個型別安全的問題了,假如我型別不是轉換成int,而是string,那麼編譯器一樣可以編譯通過,但是執行時就會丟擲異常:
由此可見,你要使上面**正確執行,你必須得正確的進行型別的顯式轉換,就僅僅因為不這樣做的話,編譯器不讓你通過而已。為了解決這個問題,dynamic由此產生。它告訴編譯器:「哥說啥就是啥,你甭跟我廢話」。見下例:
這是object和dynamic的其中乙個不同。它告訴編譯器物件的型別只有在執行時才知道,編譯器就不會對其進行干涉。這樣你可以少寫很多**。但有一點必須強調一下:dynamic並沒有增加或減少危險。當你操作物件時要用到的所有型別檢查技巧(例如反射),在動態物件中一樣要用到。例如,以下**在執行時將會丟擲異常:
二、可選(或缺省)引數
貌似這個特性在c#1.0就已經有很多人問過了,但直到4.0才有。現在你可以在方法定義的時候為引數指定乙個預設值。呼叫方法的時候既可以像平時那樣傳入引數,也可以直接跳過不傳入,這樣的話,就使用預設值傳到方法裡。例如:
值得注意一點的是,可選引數必須放在所有引數的最後。這裡就有個問題了,假如我某個方法有兩個引數,兩個都是可選引數,而我呼叫的時候只想傳入第二個引數,怎麼辦呢?我們來試試。
但很可惜,編譯通不過,這個問題,利用下面的新特性就可以解決了。
三、命名引數
在之前版本的c#中,方法定義的引數順序必須與方法呼叫時的引數順序一致,即方法method(int i, string s)呼叫時就必須第乙個傳入int,第二個傳入string,而現在,這個規矩可以被打破了。你可以自己隨便什麼順序傳入,這也在一定程度上提高了**的可讀性。例子:
這樣一來,上面的那個問題就可以迎刃而解了:
四、提高com的互操作性
基於以上三點新特性,com的互操作性也被提高了。以後不用再寫如下醜陋的**:
// . . .
excel.xlrangeautoformat.xlrangeautoformattable3,
type.missing, type.missing, type.missing,
type.missing, type.missing, type.missing);
現在只需這麼寫就搞定了:
excel.xlrangeautoformat.xlrangeautoformatclassic2);
順帶一句,這段**用到了另乙個叫做「索引屬性」的新特性,更多關於這個特性的資訊可以參考http://msdn.microsoft.com/en-us/library/ee310208%28vs.100%29.aspx
這個特性只能用於com互操作上,你不能建立自己的索引屬性。
配合system.dynamic命名空間下的expandoobject類,實現動態語言編**是太方便了,舉個例子:
好了,就先分享這麼多吧,以後有什麼新發現再與大家分享吧~~~
C 4 0的一些新特性
先來看看dynamic的乙個例子 c code dynamic dyn 1 console.writeline dyn.gettype dyn 1.234 console.writeline dyn.gettype dyn ojlovecd console.writeline dyn.gettype...
C 4 0的一些新特性
先來看看dynamic的乙個例子 c code dynamic dyn 1 console.writeline dyn.gettype dyn 1.234 console.writeline dyn.gettype dyn ojlovecd console.writeline dyn.gettype...
C 4 0的新特性
先來看看dynamic的乙個例子 dynamic dyn 1 console.writeline dyn.gettype dyn 1.234 console.writeline dyn.gettype dyn ojlovecd console.writeline dyn.gettype 輸出 sys...