這篇的出現頗神奇的,主要是因為剛好看到Javascript大全中提到duck-typing,突然想到其實C#也是可以玩玩duck-typing,結果就打算來寫這篇Orz...
看到網路上似乎有人對於var和dynamic兩個的用法有點不了解,敝人就以自己沒用多久的經驗來告訴大家兩者的差別吧!
這篇的出現頗神奇的,主要是因為剛好看到Javascript大全中提到duck-typing,突然想到其實C#也是可以玩玩duck-typing,結果就打算來寫這篇Orz...
看到網路上似乎有人對於var和dynamic兩個的用法有點不了解,敝人就以自己沒用多久的經驗來告訴大家兩者的差別吧!
var: 編譯時期決定型別 (C# 3.0)
var基本上來說,並沒有跳脫強型別的規範,它僅僅是讓你在宣告變數時,若可以明確判斷該變數為何種型別的話,就可以不必在變數宣告式寫上其型別,寫上var即可。
var一般被稱作隱含型別,它其實會在編譯的時候,編譯器自動幫你判斷該變數為何種型別,並幫你在var處填上該型別的名稱,像上面的例子var s = "XD"在編譯的時候,會用string代替掉原本的var。
舉一個簡單且常見的例子,當要對Dictionary型別去做foreach的瀏覽時,我們可直接使用var來代替掉用來當作每個單項的變數的宣告,底下範例:
dynamic:執行時期決定型別 (C# 4.0)
這個dynamic就是真正的動態變數,類似於Javascript、Python、Ruby...等等這些語言的變數,一個變數的型態決定於被指派的時候,底下是個範例:
由於變數可以動態的替換各種不同型態的值,編譯器會無法在編譯期找出錯誤,若要找出錯誤,只能等執行時期看看裡面的變數是否可做該運算而決定。
而這個地方也說明了你可以用C#來做duck-typing的事情,底下用個簡單的範例作為收尾。
參考資料
- MSDN > var (C# 參考):http://msdn.microsoft.com/zh-tw/library/bb383973.aspx
- MSDN > dynamic (C# 參考):http://msdn.microsoft.com/zh-tw/library/dd264741.aspx
- What's the difference between dynamic(C# 4) and var? - Stack Overflow:http://stackoverflow.com/questions/961581/whats-the-difference-between-dynamicc-4-and-var
- var, dynamic 差別以及如何實作像 ViewBag 一樣的物件 - Kelp Code:http://kelp.phate.org/2011/11/var-dynamic-viewbag.html