C 4 0 新特性 動態查詢

2021-04-25 09:57:04 字數 2024 閱讀 9896

visual studio 2010 已經離我們越來越近,關於 c# 4.0 的 break changes 也已經全部成型。在 c# 4.0 發布時,我們將能夠看到如下的新特性:

1、動態查詢

2、命名引數

3、可選引數和預設值

4、covariance 和 contra-variance

5、其他 .net framework 4.0 的更新 (dlr, no-pia 等)

今天我們給大家介紹一下 c# 4.0 中的動態查詢。

下面的**動態的獲取乙個 com 物件型別,並通過該型別建立這個 com 物件的例項,並準備呼叫該例項上的乙個方法實現我們需要的功能。這個例子引用了 speech api 中的 sapi.spvoice 物件,並呼叫了其 speak() 方法。

1: using system;
2:
3: type type = type.gettypefromprogid("sapi.spvoice");
4: dynamic spvoice = activator.createinstance(type);
5: spvoice.speak("hello, c# 4.0!");

編譯並執行此示例,我們通過計算機的音箱得到了正確的語音。

現在我們開始思考乙個問題,spvoice.speak(string) 這個函式簽名其實在設計時以及編譯時對於 c# 編譯器來說都是未知的。因為 spvoice 變數的型別是 system.__comobject,並且由於 sapi.spvoice 對應的 progid 指向乙個非託管的 com 物件,加上我們並沒有匯入任何 tlb 庫,因此,speak() 方法只能是在執行時由編譯器自動繫結。

這就是動態查詢最基本的意圖,它的提出是為了在 office 以及 com 互操作性程式設計中更加簡化**。dynamic 變數的所有執行時型別資訊都直接由執行時上下文繫結並執行(稱之為「晚期繫結」),這些工作通過 system.dynamic.runtimebinding 類完成。

注意:dynamic 不同於 object。object 是任何類的基礎類,它是乙個強型別的 clr 型別,是引用型別。它具備完整的執行時資訊,任何企圖訪問 object 不存在的方法簽名或者屬性都會被編譯時由編譯器檢查出來並報告錯誤。dynamic 型別在編譯時可能是未知的,所有針對它型別上的呼叫在編譯時是不會報告錯誤的,只有在執行時由 dlr 去檢查這些資訊後,才能確定乙個呼叫是否成功或者失敗。

由於 dynamic 的這些特性,使得它廣泛用於 com 以及其他互操作程式設計中,它為我們的**帶來了簡化和便利,但同時由於這個口子已經被開啟,所有強型別都可以被轉化為 dynamic,所以它如果被濫用,則會對**的維護難度有很大的提高。因為編譯器這個時候並不能在編譯時檢查更多的錯誤了。所以我們強烈建議您除了在互操作方面應用 dynamic 外,不要在其他地方濫用,以免對現有**產生潛在的維護成本。

理論上,任何 clr 支援的型別都可以轉化為 dynamic。dynamic 實現了 implicit 和 explicit 轉換運算子,因此,下面的語句都是合法的。

1: int? i = 2;
2: string s = string.empty;
3: object o = null;
4: dynamic d1 = i;
5: dynamic d2 = s;
6: var d3 = o as dynamic;

由於 dynamic 它本身就是乙個型別,因此可以應用在任何需要型別的地方。這些地方包括:

1、變數宣告;

2、函式、委託、lambda 表示式的引數型別,或者具備泛型的型別引數;

3、typeof 運算;

4、型別轉換以及 is, as 運算。

c# 4.0 中的動態查詢為我們實現 com 和 office 互操作提供了更好的解決方案,這也使得 c# 更加靠近 dlr,但如何確定在哪些地方應該使用 dynamic 卻很難讓我們抉擇,跟當年 var 一樣,dynamic 的提出總會有好的一面和壞的一面,重要的是您是如何處理它的。

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...

C 4 0 新特性之引數

c 4.0中新加了幾種引數,今天來了解一下 1.預設引數 c 4.0 現在對方法,構造器,以及索引器支援使用可預設的引數 當引數的預設值作為宣告的一部分被指定的時候,引數就是可預設的。static void changevalue intx,inty 3 int y 有乙個預設的引數3,因此它是乙個...

C 4 0 新特性之引數

c 4.0中新加了幾種引數,今天來了解一下 1.預設引數 c 4.0 現在對方法,構造器,以及索引器支援使用可預設的引數 當引數的預設值作為宣告的一部分被指定的時候,引數就是可預設的。static void changevalue intx,inty 3 int y 有乙個預設的引數3,因此它是乙個...