日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

發布時間:2023/12/4 C# 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 為什么是它們三個?

拿這三者比較的原因是它們在使用的時候非常相似。你可以用它們聲明的變量賦任何類型的值。

看看下面的示例:

var a = 1;object b = 1; dynamic c = 1;

?你還可以使用關鍵字為它們賦上更加復雜的類型

var a = new string[]{"1"};object b = new string[]{"1"}; dynamic c = new string[]{"1"};

二. 能夠任意賦值的原因

?上面的例子中,看起來三者非常相似,但是背后的原理卻是非常不同。

var是C# 3中引入的,其實它僅僅只是一個語法糖. var本身并不是一種類型, 其它兩者object和dynamic是類型。

var聲明的變量在賦值的那一刻,就已經決定了它是什么類型。

所以如果你這樣使用,就會有編譯錯誤:

var a = 1; a = "Test";

?

object之所以能夠被賦值為任意類型的原因,其實都知道,因為所有的類型都派生自object. 所以它可以賦值為任何類型:

object a = 1; a = "Test";

?那么dynamic呢?

它是C#引入的新類型,它的特點是申明為dynamic類型的變量,不是在編譯時候確定實際類型的, 而是在運行時。

所以下面的代碼是能夠通過編譯的,但是會在運行時報錯:

dynamic a = "test"; a++;

上面代碼內部處理的過程是怎樣的呢?

首先, dynamic類型賦值為字符串"test", 運行++操作的時候,.net會去尋找當前的賦值類型string中是否支持++操作,發現不支持,出現異常。

所以,如果這樣修改一下,就可以讓代碼正常運行起來

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的注意事項

有了dynamic,.net就以及有了動態類型的優勢,但是由于對于dynamic類型的所有操作,都是在運行時確定的,所有錯誤無法在編譯時候出現,使用的時候,就需要非常小心。

因為dynamic是類型,所以如果函數接受的是確定類型的參數,是不能傳入dynamic類型的,這樣會有編譯錯誤

public int Add(int a, int b){ ?
??
return a + b; } dynamic test1 = 1; dynamic test2 = 2; Add(test1, test2);


下面是對上面的例子的修正,謝謝Alan@Net. 大家可以實驗一下

  • #15樓?Alan@Net??2014-02-04 21:30

    為什么我copy你最后一個例子,并沒有報錯?

    支持(0)反對(0)

    回復引用刪除

  • #16樓[樓主]?JustRun??2014-02-07 08:30

    @Alan@Net
    應該是編譯不通過,我待會試試

    支持(0)反對(0)

    修改刪除

  • #17樓[樓主]?JustRun??2014-02-08 08:29

    @Alan@Net
    是不會報錯,對于普通的類型,int這樣的,不會有問題。
    但是如果是對象類型,運行時會報錯。

  • ?

    另外,在我們自己在寫函數時,最好不要將dynamic類型作為函數的參數,這就像是使用object作為函數參數一樣,會為程序的維護帶來后續的麻煩。

    沒有人能夠確定使用者傳入的是什么,而且編譯時候不會有問題。如果錯誤出現在運行時,就有可能是災難。

    原文地址:http://www.cnblogs.com/JustRun1983/p/3163350.html


    .NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

    總結

    以上是生活随笔為你收集整理的理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。