var, object, dynamic的區別以及使用 閱讀目錄: 一. 為什么是它們三個 二. 能夠任意賦值的原因 三. dynamic的用法 四. 使用dynamic的注意事項 拿這三者比較的原因是它們在使用的時候非常相似。你可以用它 們聲明的變量賦任何類型的值。 看看下面的示例: var a = 1; object b = 1; dynamic c = 1; 上面的例子中,看起來三者非常相似,但是背后的原理卻是非常 不同。 var是C# 3中引入的,其實它僅僅只是一個語法. var本身並不是 一種類型, 其它兩者object和dynamic是類型。 var聲明的變量在賦值的那一刻,就已經決定了它是什么類型。 所以如果你這樣使用,就會有編譯錯誤: var a = 1; a = "Test"; object之所以能夠被賦值為任意類型的原因,其實都知道,因為 所有的類型都派生自object. 所以它可以賦值為任何類型: object a = 1; a = "Test"; dynamic不是在編譯時候確定實際類型的, 而是在運行時。 所以下面的代碼是能夠通過編譯的,但是會在運行時報錯: dynamic a = "test"; a++; 三. dynamic的用法 1 直接使用該類型,可以非常方便的插入屬性, 方法 dynamic person = new System.Dynamic.ExpandoObject(); person.id = 1; person.title = "貴源網絡"; person.url = "gzmsg.com"; person.co = "軟件開發"; person.des = new Func<string>(() => person.title + person.url); Response.Write(person.des());//結果:貴源網絡gzmsg.com 2 枚舉所有成員 foreach (var property in (IDictionary<String, Object>) person) { Response.Write(property.Key + ": " + property.Value); //結果:id: 1title: 貴源網絡url: gzmsg.comco: 軟件開發 des: System.Func`1[System.String] } 3 簡化反射 常用的處理反射的例子: object calc = GetCalculator(); Type calcType = calc.GetType(); object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 }); int sum = Convert.ToInt32(res); 使用dynamic之后: dynamic calc = GetCalculator(); int sum = calc.Add(10, 20); 四,使用dynamic的注意事項 有了dynamic,.net就以及有了動態類型的優勢,但是由於對於 dynamic類型的所有操作,都是在運行時確定的,所有錯誤無法在 編譯時候出現,使用的時候,就需要非常小心。 因為dynamic是類型,所以如果函數接受的是確定類型的參數,是 不能傳入dynamic類型的,這樣會有編譯錯誤。比如: 復制代碼 public int Add(int a, int b){ return a + b; } dynamic test1 = 1; dynamic test2 = 2; Add(test1, test2); 復制代碼 另外,在我們自己在寫函數時,最好不要將dynamic類型作為函數 的參數,這就像是使用object作為函數參數一樣,會為程序的維 護帶來后續的麻煩。 沒有人能夠確定使用者傳入的是什么,而且編譯時候不會有問題 。如果錯誤出現在運行時,就有可能是災難。