var, object, dynamic的區別以及使用


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作為函數參數一樣,會為程序的維

護帶來后續的麻煩。

沒有人能夠確定使用者傳入的是什么,而且編譯時候不會有問題

。如果錯誤出現在運行時,就有可能是災難。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM