先來看看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,因此它是乙個...