C 4 0的新特性

2021-05-24 21:40:40 字數 3271 閱讀 7668

先來看看dynamic的乙個例子:

dynamic dyn =1

; console.writeline(dyn.gettype());

dyn

=1.234

; console.writeline(dyn.gettype());

dyn ="

ojlovecd";

console.writeline(dyn.gettype());

/*輸出:

system.int32

system.double

system.string

*/

可能你會說,這個效果,我用object關鍵字就可以了,幹嗎加個dynamic?那我們就來討論一下object與dynamic的區別。

先看如下**:

object

obj =10

;obj

=obj +10

; object

obj =10

;obj =(

int)obj +10

; 但是這樣就有個型別安全的問題了,假如我型別不是轉換成int,而是string,那麼編譯器一樣可以編譯通過,但是執行時就會丟擲異常:

object

obj =10

; obj =(

string

)obj +10

;/*unhandled exception: system.invalidcastexception: unable to cast object of type

'system.int32' to type 'system.string'.

*/

由此可見,你要使上面**正確執行,你必須得正確的進行型別的顯式轉換,就僅僅因為不這樣做的話,編譯器不讓你通過而已。為了解決這個問題,dynamic由此產生。它告訴編譯器:「哥說啥就是啥,你甭跟我廢話」。見下例:

dynamic dyn =10

;dyn

=dyn +10

;console.writeline(dyn);

dyn

=10.02

;dyn

=dyn +10

;console.writeline(dyn);

dyn ="

ojlovecd";

dyn

=dyn +10

;console.writeline(dyn);

這是object和dynamic的其中乙個不同。它告訴編譯器物件的型別只有在執行時才知道,編譯器就不會對其進行干涉。這樣你可以少寫很多**。但有一點必須強調一下:dynamic並沒有增加或減少危險。當你操作物件時要用到的所有型別檢查技巧(例如反射),在動態物件中一樣要用到。例如,以下**在執行時將會丟擲異常:

dynamic dyn =10

;dyn

=dyn

+datetime.now;

console.writeline(dyn);

/**/

二、可選(或缺省)引數

貌似這個特性在c#1.0就已經有很多人問過了,但直到4.0才有。現在你可以在方法定義的時候為引數指定乙個預設值。呼叫方法的時候既可以像平時那樣傳入引數,也可以直接跳過不傳入,這樣的話,就使用預設值傳到方法裡。例如:

static

void

main(

string

args)

static

void

testmethod(

inti =10

)

值得注意一點的是,可選引數必須放在所有引數的最後。這裡就有個問題了,假如我某個方法有兩個引數,兩個都是可選引數,而我呼叫的時候只想傳入第二個引數,怎麼辦呢?我們來試試。

static

void

main(

string

args)

static

void

testmethod(

inti =10

, strings =

"ojlovecd")

,s:"

, i, s);}

但很可惜,編譯通不過,這個問題,利用下面的新特性就可以解決了。

三、命名引數

在之前版本的c#中,方法定義的引數順序必須與方法呼叫時的引數順序一致,即方法method(int i, string s)呼叫時就必須第乙個傳入int,第二個傳入string,而現在,這個規矩可以被打破了。你可以自己隨便什麼順序傳入,這也在一定程度上提高了**的可讀性。例子:

static

void

main(

string

args)

static

void

testmethod2(

inti,

string

s) ,s:

", i, s);

}

這樣一來,上面的那個問題就可以迎刃而解了:

static

void

main(

string

args)

static

void

testmethod(

inti =10

, strings =

"ojlovecd")

,s:"

, i, s);}

四、提高com的互操作性

基於以上三點新特性,com的互操作性也被提高了。以後不用再寫如下醜陋的**:

var=

new//

. . ."a1

", "b4

").autoformat(

excel.xlrangeautoformat.xlrangeautoformattable3,

type.missing, type.missing, type.missing,

type.missing, type.missing, type.missing);

現在只需這麼寫就搞定了:"a1

", "b3

"].autoformat(

excel.xlrangeautoformat.xlrangeautoformatclassic2);

順帶一句,這段**用到了另乙個叫做「索引屬性」的新特性,更多關於這個特性的資訊可以參考

這個特性只能用於com互操作上,你不能建立自己的索引屬性。

C 4 0 新特性之引數

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

C 4 0 新特性 動態查詢

visual studio 2010 已經離我們越來越近,關於 c 4.0 的 break changes 也已經全部成型。在 c 4.0 發布時,我們將能夠看到如下的新特性 1 動態查詢 2 命名引數 3 可選引數和預設值 4 covariance 和 contra variance 5 其他 n...

C 4 0 新特性之引數

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