基於 VS 2010 闡述C 4個特性

2021-08-30 16:21:31 字數 2874 閱讀 7223

基於 vs 2010 闡述c# 4個特性基於 vs 2010 闡述c# 4個特性

買空間、伺服器就上主機網(cnidc.com)

虛擬主機評測+idc導航=idc123.com。

基於visual studio 2010 闡述c#4個特性

csharp4.0與以往版本基礎體現了強大的效能優勢,主要體現在以下四個方面:

1. 通過委託成員來實現介面

在c# 4.0中可以通過委託來實現某個成員的介面,例如下面的**:

以下為引用的內容:

public class foo : ilist    

} 被封閉的成員可以用委託實現乙個或多個介面,多個介面用逗號分隔。這麼做可以去掉很多冗餘的**,就像上面的示例,不再需要在封閉類(foo類)上寫一大堆方法來將介面實現交給成員變數,介面的實現會直接對映到受委託的介面實現(_collection成員變數)。這個功能同樣增強了對minxins的支援。

這個就是「委託模式」了,wikipedia上對此模式的解釋如下:

委託模式是指乙個物件對外表現某種行為,但事實上只是將實現此行為的任務將會給乙個相關的成員的技術,這種技術反轉了責任。委託模式是加強組合 (聚合)、minxins及aspects的一種基本模式。

再進一步,在委託實現介面之餘,我們也應當可以自由地重寫某些方法如下:

以下為引用的內容:

public class foo : ilist   

implements ilist;   

public foo()   

//這將覆蓋委託的執行  

// 漂亮的混入和方便的功能  

pattern implementation   

public int ilist.add(string value)   

} 2. 匿名返回型別

在c#中匿名型別可以擁有像普通的類宣告一樣的地位。(當前)匿名型別只能用於區域性變數,不能作為方法的返回值。但是如果乙個強型別的linq查詢的返回型別可以作為方法的返回型別一定很好,比如下面的**:

以下為引用的內容:

public var getproductinfos()   

;   

return productinfos;   

} 3. 一些 duck-typing or structural subtyping 型別的支援

如果乙個類中的某乙個方法/屬性的簽名和某個介面一樣,並且這個類沒有實現此介面,那麼這個類就將隱式地實現這個介面。只有這個類實現了介面規定的所有方法/屬性的時候才被認為隱式地實現了此介面。

如果這東西走起來像鴨子,晃起來像鴨子,那麼這就是鴨子!(james riley)

那麼這個和structural subtyping有什麼區別?我承認structural subtyping更適合c#的靜態樣式,所以這是個'static duck typing',或者如wikipedia所述:

duck typing與structural typing的區別僅在於型別中被訪問的部分在執行期才做相容性確認。

我們將通過乙個用例來說明這種方法有什麼好處:

在.net框架中,一部分控制項實現了乙個叫readonly的屬性,比如textbox, datagrid, numericupdown

現在我們建乙個叫ireadonlyrestricable的介面:

以下為引用的內容:

public inte***ce ireadonlyrestricable   

} 然後我們要遍歷所有的控制項,找出有readonly屬性的控制項並把此屬性設為true(譯者注:這些控制項本身沒有實現ireadonlyrestricable),在ducktyping下我們可以把控制項通過型別轉換為ireadonlyrestricable,就像下面**一樣,這樣我們就不需要通過反射去定位readonly屬性了:

以下為引用的內容:

foreach (control c in f.controls)   

在我看來ducktyping的最大好處是可以為你不需要訪問的類庫定義一些介面,這可以盡可能地減少相互依賴,你可以檢視phil haacks more extensive post on duck typing這文章來看看為什麼作者相信這對c#有好處。

krzysztof cwalina認為,很顯然的,c#的foreach關鍵字已經使用了duck typing.

4. 安全的null延遲賦值操作符

我很想看到一種安全地訪問乙個值為null的物件的屬性的表示式,表示式可能形如object.property.property.value

比如我要訪問customer?.firstname,但是customer是null,此時customer?.firstname會返回null而不是丟擲個nullreferenceexception

再看看下面的**,你就會知道怎麼用了:

1、//如果不是客戶或命令無效,這將丟擲乙個像往常一樣空引用異常   

2、int ordernumber = customer.order.ordernumber;  

3、//這將無法編譯,因為它需要乙個空的返回型別    

4、int ordernumber = customer.order?.ordernumber;   

5、//這將返回null,如果客戶是空或者如果命令是空  

6、int? ordernumber = customer?.order?.ordernumber;    

7、if (ordernumber.hasvalue)    

8、//... 用它做一些事情   

9、//而不是必須做   

10、if ((customer != null) && (customer.order != null))    

11、int a = customer.order.ordernumber  

C 4 0和VS2010新特性

dynamic初探 以前因為某些特殊原因,需要動態的呼叫外部類 假設這個類是實現了某個帶有引數的介面函式的 通常我們只能用反 示例 如下 assembly asm assembly.loadfile xx asm.createinstance myassembly.classname gettype...

vs2010與C 4 0新特性

vs2010被認為將是續寫visual studio 6 的扛鼎之作。整個ide不僅是使用了wpf重構,而且使用了最新的net framework 4作為強大的後援支撐。從上至下可圈可點。下面我們就來看一看vs2010在哪些方面引人注目 1 wpf重構介面 整個vs2010 ide全部使用wpf重構...

C 4 0和VS2010新特性(二)

6 協變和反變 co variant crop variant 這是vs2010新增的乙個內容,用於在編譯的時候確認是否允許不同型別的泛型介面之間是否存在轉換的問題。為了了解 協變 和 反變 的概念,我們先看乙個例子 假設我們定義了乙個介面和若干類 class father public virtu...