c#中object、var和dynamic的區別小結
原文連結:
Difference Between Object and Dynamic Keyword in C#
Difference between var and dynamic in C#
篇一(dynamic與object的區別)
我們經常看到很多C#開發者並不能區分object與dynamic變數。我最近也嘗試在網上找相關的教程和文章,不過還是沒有找到比較好的解釋。這篇文章將梳理object與dynamic區別的關鍵點。
總的來說,dynamic與object都不進行編譯時型別檢查(compile-time type checks),只有在執行時才會對變數型別進行檢查,同時,dynamic和object修飾的變數都能儲存任意資料型別。object是C# 1.0引入的,而dynamic是C# 4.0引入的。稍後我會講一下為什麼要引入dynamic。(明明object已經存在了,為什麼還要引入dynamic?)
下面一些要點解釋了兩者的主要區別
區別一
Object: 對於object,編譯器所給的提示資訊較少。它不是編譯器安全的。
例子:
ps: 你在對object取值/賦值時,每次都必須要顯式轉換為自己想要的資料型別。
object a = "Rohatash Kumar";
string a1 = a.ToString();
Dynamic: 編譯器不顯示任何提示資訊。
用法:
dynamic a = "Rohatash Kumar";
string a1 = a;
區別二
Object: C# 1.0引入
Dynamic: C# 4.0引入
區別三
Object: 在使用object時,你必須將object轉換為原始資料型別才能進行預期操作。正如區別一所示,下面是錯誤示範:
object a = "Rohatash Kumar"; string a1 = a;
因此你必須每次都要進行顯式轉換
Dynamic: 不需要進行顯示轉換,但需要知道它內部的屬性和方法。(但在點操作的時候,編譯器不會提示)
區別四
Object: 如果此前沒有轉換為合適的資料型別(即錯誤的型別轉換),編譯器會在執行時丟擲錯誤。即編譯的時候不會報錯,而在執行(呼叫)的時候就會報錯。
例子
String a = "Rohatash Kumar"; object a1 = a; int b = (int)a1;
ps:上面的a為string型別;a1為object型別,儲存著a的副本。因此不能將a1顯示轉換為int型別。
Dynamic: dynamic不會報錯,因為編譯器儲存著dynamic變數的所有資訊。
dynamic與object總結:
Object 在我們不知道資料型別時很有用。 Dynamic 更多是用在反射,支援動態語言,COM物件呼叫以及獲取LINQ的查詢結果。
篇二(var與dynamic的區別)
var是C# 3.0引入的(基於 .NET 3.5),dynamic是C# 4.0。
var宣告的變數都是靜態型別,dynamic是動態型別。dynamic的引入是為了支援像ruby,python這樣的動態語言。
##### 對照表
var | dynamic |
---|---|
C# 3.0引入 | C# 4.0引入 |
靜態型別– 在編譯的時候就確定了型別 | 動態型別– 在執行時才確定變數型別 |
需要在定義時完成初始化。 例如:var str="I am a string";str這個變數會被編譯器當作string型別。 | 不需要在定義時初始化。 例如,以下程式碼沒有任何問題:dynamic str;str="I am a string";str=2; |
編譯時捕獲錯誤因為編譯器在編譯的時候就知道了它的屬性,型別和方法。 | 執行時才會捕獲錯誤因為編譯器在執行的時候才知道其屬性,型別及方法。 |
Visual Studio會顯示補全提示(intellisense)因為對於編譯器而言,變數的型別是確定的/知道的。 | 沒有智慧提示因為只有執行時才能知道其型別,屬性及方法。 |
例如,var obj1;將丟擲編譯錯誤因為變數沒有被初始化,而編譯器在編譯時需要根據它的值推斷出型別。 | 而dynamic obj1;則編譯成功 |
如,var obj1=1;編譯沒有問題,而再加上下面這句var obj1=” I am a string”;就會報錯因為obj1的資料型別已經在第一句賦值時就確定了,也就是System.Int32(數字1所對應的資料型別) 而第二句把string型別的值賦給Int32自然就違反型別安全了。(一般而言,不同型別不能直接賦值) | 又如,dynamic obj1=1;沒有問題,再加上dynamic obj1=" I am a string";還是沒有問題因為編譯器首先將obj1指定為Int32型別(執行時指定),在第二句呼叫時又將obj1重新指定為string。程式碼完美執行,不會報錯。 |
總結
到此這篇關於c#中object、var和dynamic區別的文章就介紹到這了,更多相關c#中object、var和dynamic區別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!