C 4 0的一些新特性

2021-05-22 08:55:06 字數 4034 閱讀 4796

先來看看dynamic的乙個例子:

c# code

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的區別。

先看如下**:

c# code

object

obj =10

; obj

=obj +10

;

c# code

object

obj =10

; obj =(

int)obj +10

;

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

c# code

object

obj =10

; obj =(

string

)obj +10

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

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

*/

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

c# code

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並沒有增加或減少危險。當你操作物件時要用到的所有型別檢查技巧(例如反射),在動態物件中一樣要用到。例如,以下**在執行時將會丟擲異常:

c# code

dynamic dyn =10

; dyn

=dyn

+datetime.now;

console.writeline(dyn);

/*unhandled exception: microsoft.csharp.runtimebinder.runtimebinderexception: oper

at callsite.target(closure , callsite , object , datetime )

at system.dynamic.updatedelegates.updateandexecute2[t0,t1,tret](callsite site

, t0 arg0, t1 arg1)

*/

二、可選(或缺省)引數

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

c# code

static

void

main(

string

args)

static

void

testmethod(

inti =10

)

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

c# code

static

void

main(

string

args)

static

void

testmethod(

inti =10

, strings =

"ojlovecd")

,s:", i, s);

}

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

三、命名引數

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

c# code

static

void

main(

string

args)

static

void

testmethod2(

inti,

string

s) ,s:

", i, s);

}

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

c# code

static

void

main(

string

args)

static

void

testmethod(

inti =10

, strings =

"ojlovecd")

,s:", i, s);

}

四、提高com的互操作性

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

c# code

var=

new//

. . ."a1

", "b4

").autoformat(

excel.xlrangeautoformat.xlrangeautoformattable3,

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

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

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

c# code "

a1", "

b3"].autoformat(

excel.xlrangeautoformat.xlrangeautoformatclassic2);

順帶一句,這段**用到了另乙個叫做「索引屬性」的新特性,更多關於這個特性的資訊可以參考http://msdn.microsoft.com/en-us/library/ee310208%28vs.100%29.aspx

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

C 4 0的一些新特性

先來看看dynamic的乙個例子 可能你會說,這個效果,我用object關鍵字就可以了,幹嗎加個dynamic?那我們就來討論一下object與dynamic的區別。先看如下 但是這樣就有個型別安全的問題了,假如我型別不是轉換成int,而是string,那麼編譯器一樣可以編譯通過,但是執行時就會丟擲...

C 4 0的一些新特性

先來看看dynamic的乙個例子 c code dynamic dyn 1 console.writeline dyn.gettype dyn 1.234 console.writeline dyn.gettype dyn ojlovecd console.writeline dyn.gettype...

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