在剛剛落下帷幕的PDC上,我們得到了很多振奮的訊息,包括C# 4.0及VS2010等等。Anders Liu 已經 將C# 4.0 新特性白皮書翻譯了 出來,那裡面有非常詳細的介紹。
C#的發展是很快很快的,C#的設計目的是成為一個有趣有用通用的程式語言,並因此讓使用該語言的使用者能獲得更大的成功。所以,C#除了物件導向的基本特徵外,現在引入了相當多的其他特徵喔!
動態,動態。動態是目前超級流行的詞彙。C#也要動起來了喔!
C# 4.0的主要主題是動態編程。對象的意義變得越來越“動態”,它們的結構和行為無法通過靜態類型來捕獲,或者至少編譯器在編譯器時無法得知對象的結構和行為。
相關的特性有動態尋找、具名引數、選擇性參數等。
還有,簡化了與COM的互操作。
還有,協變和逆變 Covariance and contravariance 。
這些都在白皮書裡可以找到介紹。我在這裡整理一下協變和逆變的一些參考資料,本來數學就不好,怕過一兩天就又忘了,俗話說,好記性不如爛筆頭嘛。
首先看看問題的引入。
這裡有兩個類型,T 和 U,在這兩個類型間,以下偽運算式肯定有一個是“真”:
- T > U
- T < U
- T = U
- T 和 U 沒有任何關係
例如有這些類型:動物 Animal、哺乳動物 Mammal、爬行動物 Reptile、長頸鹿 Giraffe、老虎 Tiger、蛇 Snake和海龜 Turtle,它們之間的繼承關係(應該來個UML就一目瞭然了)有:哺乳動物是動物的一個子類,長頸鹿是哺乳動物的一個子類等等……
看圖:
那麼就有:哺乳動物比長頸鹿大,比動物小,等於哺乳動物,和爬行動物卻沒有關係(這裡的比較都不是對象之間的比較,要注意哦。)
呃,如果這個難於理解,我們再看看程式中的情況。假設有一個變數,這個變數在C#中有一個容身之處(不是說的儲存區的物理地址),每一個變數在C#中的容身之處都對應一個類型(強型別語言就是這樣的),那麼,在運行時你可以在一個特定的容身之處儲存對應類型的執行個體或者小於這個類型的類型的執行個體(拗口-,-)。所以呢,哺乳動物對象對應的容身之處可以儲存一個長頸鹿,但是不能儲存一個海龜。(考慮面先介面編程和抽象基類的思想)
容身之處這個例子說明的是“交換原則”,跟面向介面編程和抽象基類的機制很類似,也就是在很多地方,我們用子類代替基類(或介面或抽象類別)來使用。
現在來定義什麼是協變:一個操作如果在 T 和 U 兩個類型上執行後返回的 T' 和 U' 之間的關係跟原來的 T 和 U 之間的關係(上面那4個偽運算式)相同,則這個操作就叫做協變。英文名:Covariance。
再看看什麼是逆變:一個操作如果將 T 和 U 的大小關係改變了(大變小,小變大 - 逆轉),但是不改變 T 和 U 之間的相等或不相干這兩個關係,則這個操作就叫做逆變。英文名:Contravariance。
呃呃。變來變去,頭已經暈了。
(還沒完,等我喔!)