理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
一. 為什么是它們?nèi)齻€(gè)?
拿這三者比較的原因是它們在使用的時(shí)候非常相似。你可以用它們聲明的變量賦任何類型的值。
看看下面的示例:
var a = 1;object b = 1; dynamic c = 1;?你還可以使用關(guān)鍵字為它們賦上更加復(fù)雜的類型
var a = new string[]{"1"};object b = new string[]{"1"}; dynamic c = new string[]{"1"};二. 能夠任意賦值的原因
?上面的例子中,看起來三者非常相似,但是背后的原理卻是非常不同。
var是C# 3中引入的,其實(shí)它僅僅只是一個(gè)語法糖. var本身并不是一種類型, 其它兩者object和dynamic是類型。
var聲明的變量在賦值的那一刻,就已經(jīng)決定了它是什么類型。
所以如果你這樣使用,就會有編譯錯誤:
var a = 1; a = "Test";?
object之所以能夠被賦值為任意類型的原因,其實(shí)都知道,因?yàn)樗械念愋投寂缮詏bject. 所以它可以賦值為任何類型:
object a = 1; a = "Test";?那么dynamic呢?
它是C#引入的新類型,它的特點(diǎn)是申明為dynamic類型的變量,不是在編譯時(shí)候確定實(shí)際類型的, 而是在運(yùn)行時(shí)。
所以下面的代碼是能夠通過編譯的,但是會在運(yùn)行時(shí)報(bào)錯:
dynamic a = "test"; a++;上面代碼內(nèi)部處理的過程是怎樣的呢?
首先, dynamic類型賦值為字符串"test", 運(yùn)行++操作的時(shí)候,.net會去尋找當(dāng)前的賦值類型string中是否支持++操作,發(fā)現(xiàn)不支持,出現(xiàn)異常。
所以,如果這樣修改一下,就可以讓代碼正常運(yùn)行起來
dynamic a = "test"; a = 1; a++;三. dynamic的用法
1 直接使用該類型,可以非常方便的插入屬性, 方法
static void Main(string[] args) {dynamic person = new System.Dynamic.ExpandoObject();person.Name = "cary";person.Age = 25;person.ShowDescription = new Func<string>(() => person.Name + person.Age);Console.WriteLine(person.Name + person.Age + person.ShowDescription());Console.ReadLine(); }2?枚舉所有成員
foreach (var property in (IDictionary<String, Object>)dynEO) {Console.WriteLine(property.Key + ": " + property.Value); }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的注意事項(xiàng)
有了dynamic,.net就以及有了動態(tài)類型的優(yōu)勢,但是由于對于dynamic類型的所有操作,都是在運(yùn)行時(shí)確定的,所有錯誤無法在編譯時(shí)候出現(xiàn),使用的時(shí)候,就需要非常小心。
因?yàn)閐ynamic是類型,所以如果函數(shù)接受的是確定類型的參數(shù),是不能傳入dynamic類型的,這樣會有編譯錯誤
public int Add(int a, int b){ ???return a + b; } dynamic test1 = 1; dynamic test2 = 2; Add(test1, test2);
下面是對上面的例子的修正,謝謝Alan@Net. 大家可以實(shí)驗(yàn)一下
#15樓?Alan@Net??2014-02-04 21:30
為什么我copy你最后一個(gè)例子,并沒有報(bào)錯?
支持(0)反對(0)
回復(fù)引用刪除
#16樓[樓主]?JustRun??2014-02-07 08:30
@Alan@Net
應(yīng)該是編譯不通過,我待會試試
支持(0)反對(0)
修改刪除
#17樓[樓主]?JustRun??2014-02-08 08:29
@Alan@Net
是不會報(bào)錯,對于普通的類型,int這樣的,不會有問題。
但是如果是對象類型,運(yùn)行時(shí)會報(bào)錯。
?
另外,在我們自己在寫函數(shù)時(shí),最好不要將dynamic類型作為函數(shù)的參數(shù),這就像是使用object作為函數(shù)參數(shù)一樣,會為程序的維護(hù)帶來后續(xù)的麻煩。
沒有人能夠確定使用者傳入的是什么,而且編譯時(shí)候不會有問題。如果錯誤出現(xiàn)在運(yùn)行時(shí),就有可能是災(zāi)難。
原文地址:http://www.cnblogs.com/JustRun1983/p/3163350.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微服务架构师的职责——《微服务设计读书笔
- 下一篇: 建模:确定服务的边界——《微服务设计》读