VS2010開發體驗系列之二 語言C 4 0

2021-05-22 11:14:49 字數 2301 閱讀 8525

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版本移植過來,可...