【翻譯】c#中object,var與dynamic的區別

原文連接:
Difference Between Object and Dynamic Keyword in C#
Difference between var and dynamic in C#python


篇一(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?)ruby

下面一些要點解釋了二者的主要區別wordpress

區別一

Object: 對於object,編譯器所給的提示信息較少。它不是編譯器安全的。
例子:
image
ps: 你在對object取值/賦值時,每次都必需要顯式轉換爲本身想要的數據類型。
object a = "Rohatash Kumar";
string a1 = a.ToString();spa

Dynamic: 編譯器不顯示任何提示信息。
用法:
dynamic a = "Rohatash Kumar";
string a1 = a;code

區別二

Object: C# 1.0引入
Dynamic: C# 4.0引入對象

區別三

Object: 在使用object時,你必須將object轉換爲原始數據類型才能進行預期操做。正如區別一所示,下面是錯誤示範blog

object a = "Rohatash Kumar";
string a1 = a;

所以你必須每次都要進行顯式轉換
Dynamic: 不須要進行顯示轉換,但須要知道它內部的屬性和方法。(但在點操做的時候,編譯器不會提示)教程

區別四

Object: 若是此前沒有轉換爲合適的數據類型(即錯誤的類型轉換),編譯器會在運行時拋出錯誤。即編譯的時候不會報錯,而在運行(調用)的時候就會報錯。
例子
String a = "Rohatash Kumar";
object a1 = a;
int b = (int)a1;
image
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。代碼完美執行,不會報錯。
相關文章
相關標籤/搜索