c#從1.0到4.0, 每次都會引入比較大的變化, 比如2.0的泛型,3.0的var,這次4.0也引入了一些新的東西,如下:
筆者首次嘗試了這4個新特性,下面一一做簡單的介紹:
1. dlr(動態語言執行時)
在clr之上,.net引入了乙個叫dlr(dynamic language runtime)的元件,這套元件提供了一系列的服務,用以支援動態語言。細分下來,主要是兩方面:在靜態語言型別中引入動態型別和支援動態語言比如ironruby&ironpython. 以下這個架構圖可以幫助您理解dlr。
剛才講到, dlr提供了兩個方面的支援,下面分別演示一下**:
第乙個方面,靜態語言型別的動態支援,讓我們看看一組**,假設有三個類,customer, vip, parterner.
可以看到,對於dynamic關鍵字宣告的物件,是不會在編譯時檢查型別的成員比如屬性的,在runtime時dlr會動態檢查物件的成員,並執行之。
有人認為,這樣做的好處是,可以在修改了類名的情況下,保持呼叫者**不變。我個人認為這個功能意義不大,如果非要保持呼叫者不變,做好inte***ce就行了,何必這麼辛苦呢。更何況,這種靜態型別跟動態型別之間的轉換,performance還是比較差的,儘管dlr提供了方法呼叫的cache功能,效能上能有多大提公升,還需驗證。
第二個方面,是對動態語言的支援。
乙個是對ironpython和ironruby的支援,乙個是c#/vb等靜態型別語言與動態型別語言的互動。前者超出了c#4.0的範疇,我們重點看看後者。
如以上**所示,這個動態型別的核心是trygetmember和trysetmember這兩個方法(當然,必須繼承dynamicobject類,或者dynamicemetaobject類,或者實現idynamicmetaobjectprovider介面). 當編譯器發現**試圖get/set乙個沒有預先定義的property時,就會讓dlr去trygetmember/trysetmember方法中尋找對應的property。這個實現也是與動態語言比如ironpython/ironruby互動的基礎。
2. 命名引數和可選引數
這個比較簡單,相信下面的**可以很快讓人明白這個特性。
可選引數示例(顧名思義,就是定義過預設值的引數,是可選的,呼叫方可以決定是否傳值進來)
命名引數示例(對於上面最後一種情況,可以在呼叫方顯示制定傳入值屬於哪個引數)
3. 特定於com的互操作
還記得這樣的**麼, 當我們想訪問乙個excel檔案, 我們需要寫一堆無用的ref missing, 如下:
missing.value,missing.value,missing.value,missing.value
,missing.value,missing.value,missing.value,missing.value
,missing.value,missing.value,missing.value,missing.value);
現在, 簡化成下面這樣了,
對此, 沒什麼好說的, 只能說原來太失敗了.
據介紹, 在c#4.0中, 對com的互操作主要做了一下改進,
optional and named parameters
indexed properties
optional 「ref」 modifier
interop type embedding (「no pia」)
有空可以仔細研究每個改進的細節.
4. 協變和逆變
這個feature更像是修bug。
我覺得需要先解釋一下什麼是協變, 什麼是逆變.
所謂協變, 是指把型別從子類變到基類; 逆變, 則是把型別從基類變到子類. 在c#3.0中, 也有協變和逆變, 是針對delegate做的, 看如下**:
在c#4.0中, 增加了對泛型的支援, 包括delegate的泛型引數和泛型的inte***ce. 還是拿delegate舉例,
協變, 如下**在c#4.0以前,是不合法的:
在c#4.0裡面, 因為有了對泛型委託協變的支援, 可以稍作修改如下:
逆變, 如下**在c#4.0以前, 是不合法的:
在c#4.0裡面, 因為有了對泛型委託逆變的支援, 可以稍作修改如下:
同理, 對於泛型inte***ce, 也是如此.
關於協變和逆變, 借鑑了這篇帖子http://www.cnblogs.com/fox23/archive/2010/03/09/1615698.html, 可以去這篇帖子裡看更詳細的說明.
以上是c#4.0在語言層面的新特性, 當然, 還有很多細節, 光協變和逆變就可以寫出一本書, 留待以後研究.
體驗VS2010 (功能改進篇)
下午在使用vs2010進行了一些簡單的編碼體驗,下面談一下和以前版本的一些不同的地方,僅限於工具的使用方面,有關net4.0方面的知識將在以後深入研究。首先來看下建立專案的對話方塊,在左邊的installed templates裡多出了幾個選項,如cloud service f 等。點選左邊欄中的c...
使用VS2010進行Django開發
一 安裝python2.7 因為django1.4 目前還不能支援最新版本的python3.2.3 安裝完了,我們配置一下環境變數,這樣我們可以使用cmd 在任何地方執行python命令了 二 安裝python tools for visual studio 當前版本為 1.5 beta 1,支援d...
vs2010配置Qt開發環境
vs2010配置qt開發環境 3.qt在vs2010下的外掛程式 注意 1.先安裝qt庫,後安裝qt外掛程式 錯誤處理 1.unable to find a qt build to solve this problem specify a qt build,見下圖 2.如果是老的qt版本移植過來,可...