2008-11-18 42 views
26

另外,在C#4.0出來,我們有動態關鍵字如本excellent presentation by Anders Hejlsberg描述,(C#是不斷髮展的速度比我能跟得上..我沒有太多的時間來熟悉自己與var關鍵字)新的'動態'C#4.0關鍵字是否棄用'var'關鍵字?

我仍然需要var關鍵字嗎?有什麼var可以做..動態不能?

var x = SomeFunctionThatIKnowReturnsSomeKindOfList(); 
// do something with x 

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList(); 
// do something with x 
+3

也許不重要,但雖然var是關鍵字,但動態不是。這是一種類型。 – TimothyP 2008-11-18 16:58:59

+0

所以它'動態'基本上就像聲明某種類型的「對象」,但編譯器不會抱怨,當你調用它不存在的方法? – 2009-02-20 09:45:29

+1

是的,它會在運行時解決。如果存在,該方法將被稱爲..如果不是Boom! – Gishu 2009-02-20 11:06:37

回答

72

不,他們是非常不同的。

var表示「在編譯時推斷變量的類型」 - 但它仍然完全靜態綁定。

dynamic意思是「假設我可以做任何事情,我想這個變量」 - 即編譯器不知道哪些操作是可用的,並且DLR會制定出什麼樣的叫聲真的意味着在執行時間。

我想到用dynamic很少 - 只有當我真正想要的動態行爲:

  • var讓你趕上在編譯時錯別字等
  • 靜態綁定代碼總是會跑的比動態快(即使差異變得相當小)
  • 靜態綁定的代碼給出了更多的編譯時支持,而不僅僅是錯誤:你可以找到調用層次結構,重構會更好,Intellisense可用等
+0

這是我缺少的一塊...... var是靜態綁定的(因此帶有編譯時檢查,工具等的好處) – Gishu 2008-11-18 10:09:02

17

Dynamic和var代表兩個完全不同的想法。

變種

瓦爾基本上要求編譯器找出變量的基礎上的賦值語句的右手側的表達式的類型。然後該變量就像它被顯式聲明爲表達式的類型一樣被處理。例如,下面的兩個語句是等效

var a = "foo"; 
string a = "foo"; 

的關鍵,這裏帶走的是「無功」,是100%類型安全,是一個編譯時操作

動態

動態是在很多方面與var完全相反。使用動態從本質上消除了特定變量的所有類型安全。它有許多方式,它沒有類型。在變量上調用方法或字段時,如何在運行時調用該字段。例如

dynamic d = SomeOperation(); 
d.Foo(); // Will this fail or not? Won't know until you run the program 

在這裏帶走的關鍵是「動態」不是類型安全的,是一個運行時操作

1

是的,你仍然需要VAR:

瓦爾變量其類型將由編譯器推斷。
動態將有它的類型在運行時分配

所以:

Var i = "Hello World" 

都會有它的類型推斷在這樣一個字符串類型intellisence會給你所有的字符串可以用這樣的方法,

i.Split("/") 

凡爲:

dynamic i = "Hello World" 

不會有它的類型推斷,直到運行時,因爲編譯器不到風度知道它是什麼類型呢,但仍然讓你做的事:

i.Split("/") 

,但是當它調用,你需要它的方法可能會失敗,因爲類型是錯誤的,並且方法不存在。