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作為函數參數一樣,會為程序的維
護帶來后續的麻煩。
沒有人能夠確定使用者傳入的是什么,而且編譯時候不會有問題
。如果錯誤出現在運行時,就有可能是災難。