先來看看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...