2010-08-12 86 views
7

聲明爲動態的變量和聲明爲System.Object的變量之間有什麼區別?運行下面的功能似乎表明,這兩個變量會馬上轉換爲動態的正確類型:動態和System.Object之間的區別

void ObjectTest() 
{ 
    System.Object MyTestVar = "test"; 
    dynamic MyTestVar2 = "Testing 123"; 

    Console.WriteLine("{0}", MyTestVar.GetType()); 
    Console.WriteLine("{0}", MyTestVar2.GetType()); 

    MyTestVar = 123; 
    MyTestVar2 = 321; 

    Console.WriteLine("{0}", MyTestVar.GetType()); 
    Console.WriteLine("{0}", MyTestVar2.GetType()); 
} 
+1

前段時間我寫了一篇關於這個帖子的文章:http://blogs.msdn.com/b/csharpfaq/archive/2010/01/25/what-is-the-difference-between-dynamic-and-object -keywords.aspx – 2010-08-12 21:15:37

回答

6

不同的是,MyTestVar2.ToUpper()編譯和作品,沒有任何明確的鑄造。

object是正常類型。
dynamic基本上是一個佔位符類型,它會導致編譯器發出動態的延遲調用。

GetType()object類定義的一個正常函數,它在您調用它的實例上運行。
GetType()完全不受引用您所調用對象的變量的聲明類型的影響。 (可空)除外

+0

所以你在說什麼,你可以在動態變量上調用特定於對象的方法? – Icemanind 2010-08-12 01:27:25

+2

您可以在'dynamic'變量上調用_any_方法。代碼'dynamic x = 3; x.Explode();'會很好的編譯 – SLaks 2010-08-12 01:28:52

1

您應該從這個優秀的MSDN article開始。差異可以概括相當簡潔:

在編譯的時候,也就是 類型爲動態假定支持 任何操作的元素。

System.Object只操作了一把,它支持 - ToString()Equals()

1

的根本區別是編譯時間(對象)與運行時(動態) resoulution電話。它也被稱爲早期與晚期綁定。 [注:添加引用Microsoft.CSharp以下代碼編譯]

object o = "Hello world";// fine because a derived type can be assigned to a base type 
    dynamic d= "Hello world";// fine as well 

    Type otype=o.GetType();// compiles because it confirms that object has a GetType() 
    Type dtype=d.GetType();// also compiles but for another reason (i.e.no binding yet) 

    string upperd= d.ToUpper(); // compiles because no binding yet (anything goes :) 
    string uppero= o.ToUpper(); // Fails to compile. Object has no ToUpper() method 

如果您註釋掉最後一次通話,應用程序應該運行很好,因爲CLR,當它到達第二次調用d .ToUpper()在運行時,它會在字符串類型中尋找一個方法ToUpper()並且會在那裏找到它(因爲在第二個語句中d被分配了一個字符串)。最後一次調用沒有編譯,因爲ToUpper()在編譯時在System.Object類型中搜索,當然不會在那裏。