亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# dynamic關鍵字的使用方法

2020-01-24 03:25:14
字體:
來源:轉載
供稿:網友

C#是一種類型安全的編程語言(所有表達式都能解析成某個類型的實例,在編譯器生成的代碼中,只會執行對這個類型有效的操作),和非類型安全的語言相比,類型安全的優勢就體現出來了:
1.許多錯誤能在編譯時檢測到,取保代碼在執行它之前是正確的。
2.編譯時語言通常能生成更小,更快的代碼。(在編譯時進行更多的假設,并在IL和元數據中落實那些假設)

為了方便開發人員使用反射或者與基本組件通信,dynamic誕生了!
一下代碼展示了如何利用反射在一個String目標("根據我找類型")上調用一個方法(“Contains”),向它傳遞一個實參(“我只是一個string參數”),并將結果存儲到局部變量result中。

復制代碼 代碼如下:

static void Main()
        {
            object target = "根據我找類型";
            object arg = "我只是個string參數";
            Type[] argtype = new Type[] { arg.GetType()};
            System.Reflection.MethodInfo method = target.GetType().GetMethod("Contains", argtype);

            object[] argm = new object[] { arg};
            Boolean result=Convert.ToBoolean(method.Invoke(target,argm));
}


現在,有了dynamic!
復制代碼 代碼如下:

static void Main()
        {
            dynamic target = "根據我找類型";
            dynamic arg = "參數";
            Boolean result = target.Contains(arg);
}

是不是發現有了顯著的簡化。
復制代碼 代碼如下:

static void Main()
        {
            Application excel = new Application();
            excel.Visible = true;
            excel.Workbooks.Add(Type.Missing);
            ((Range)excel.Cells[1, 1]).Value = //www.49028c.com/smailxiaobai/archive/2011/11/25/"放入單元格的字符";//如果沒有dynamic類型,excel.Cells[1,1]的返回值是objec類型,必須先把它轉換為Rang類型才能訪問Value屬性。
            excel.Cells[1, 1].Value = //www.49028c.com/smailxiaobai/archive/2011/11/25/"放入單元格的字符";//為COM對象生成一個可由“運行時”調用的包裝程序集時,COM方法中使用的任何variant實際都會被轉換為dynamic,這稱為動態化(dynamicfication)。
            //所以這里excel.Cells[1,1]是dynamic類型,可以不必顯示把它轉換成Range類型也能訪問它的Value。動態化顯著簡化了與COM對象的互操作。
        }

看到了dynamic的神奇,那再讓我們刨根問底吧。
我們可以用dynamic表達式或變量調用一個成員,比如字段,屬性/索引器,方法,委托,以及一元/二元/轉換操作符,當我們的代碼使用dynamic表達式或變量調用一個成員時,編譯器會生成特殊的IL代碼來描述所需的操作。
這種特殊的代碼稱為payload(有效載荷)(這些payload代碼使用了一個稱為運行時綁定器(runtime binder)的類),在運行時,payload代碼根據當前由dynamic表達式/變量引用的對象的實際類型來決定具體的操作。
看這個例子:
復制代碼 代碼如下:

        static void Main()
        {
            for (int i = 0; i < 2; i++)
            {
                dynamic arg = (i == 0) ? (dynamic)10 : "A";
                dynamic result = plus(arg);//第一次循環i==0 ,arg=10;所以調用plus時,返回的是int類型。第二次是string類型。
                M(result);//payload代碼判斷出傳給M的值的實際類型,然后調用相應的重載方法。
            }
          Console.ReadKey();
        }
        static dynamic plus(dynamic arg) { return arg+arg;}
        static  void M(int n) { Console.WriteLine("M(int):{0}", n); }
       static void M(string s) { Console.WriteLine("M(string):{0}", s); }
    }

在字段類型,方法參數類型或方法類型被指定為dynamic的前提下,編譯器會將這個類型轉換為System.Object,并在元數據中向字段,參數或者返回類型應用System.Runtime.CompilerSevices.DynamicAttribute的一個實例。如果是一個局部變量被指定為dynamic,變量類型也會成為Object,但不會向局部變量應用DynamicAttribute,應為它的使用限制在方法之內。
由于dynamic就是object 所以不僅僅將dynamic變成object,或者object變成dynamic就獲取兩個不同的方法簽名。例子:
復制代碼 代碼如下:

  object dd(dynamic i) { return i; }
 dynamic dd( object i) {return i; }

這就通不過編譯。
dynam的類型轉換:
復制代碼 代碼如下:

 static void Main()
        {
            object o = 123;//(裝箱)
            Int32 n = o;//錯誤!不允許從object到int32的隱式轉換。
            Int32 n1 = (Int32)o;//從object顯示轉換到int32。(拆箱)

            dynamic od = 123;//(裝箱)
            dynamic os = "dsfsdf";
            Int32 ns = os;//運行時報錯。
            Int32 nd = od;//從dynamic隱式轉換為int32(拆箱)
            //在本例中可看出,dynamic轉為其他類型時,允許省略顯示轉型。
            //但是CLR會在運行時驗證轉型,確保類型安全。如果對象類型不兼容要轉換成的類型,clr就會拋出一個InvalidCastException異常。
        }


dynamic和var的區別:
1.var聲明一個局部變量只是一種簡化語法,它要求編譯器根據一個表達式推斷具體的數據類型。
2.var只能用于聲明方法內部的局部變量,而dynamic可用于局部變量,字段,參數。
3.表達式不能轉型為var,但能轉型為dynamic。
4.必須顯式初始化用var聲明的變量,但無需初始化用dynam聲明的變量。
使用dynamic應注意:
在運行時,Microsoft.Csharp.dll必須加載到AppDomain中,這回損害程序性能,并增大內錯耗用,Microsoft.Csharp.dll還會加載System.dll和System.Core.dll,如果使用dynamic與COM組件互操作,還會加載System.Dynamic.dll,payload代碼執行時會在運行時生成動態代碼。這些代碼會進入一個駐留在內存的程序集,稱為“匿名寄宿的DynamicMethods程序集”(Anonymously Hosted DynamicMethods Assembly).
當一個特性的調用使用具有相同運行時類型的dynamic實參發出了大量調用時,這個代碼可以增強調度的性能。
雖然dynamic能簡化語法,但是動態求值功能產生的額外開銷也是不容忽視的,畢竟加載所有這些程序集以及額外的內存消耗,會對性能產生額外的影響。如果程序中只是一兩個地方需要動態行為,或許傳統的做法會更加高效。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久中国妇女中文字幕| 亚州精品天堂中文字幕| 疯狂欧美牲乱大交777| 亚洲欧美中文日韩在线| 97久久伊人激情网| 91免费视频网站| 成人黄色网免费| 国产一区二区三区视频免费| 97高清免费视频| 亚洲free性xxxx护士hd| 欧美老少做受xxxx高潮| 亚洲激情在线观看| 7777精品久久久久久| 亚洲深夜福利视频| 性欧美在线看片a免费观看| 日本午夜在线亚洲.国产| 成人性生交xxxxx网站| 欧美中文在线字幕| 亚洲剧情一区二区| 欧美在线观看网站| 久久精品国产久精国产一老狼| 亚洲天堂av网| 久久免费精品日本久久中文字幕| 97精品国产97久久久久久| 久久久精品一区二区| 国产精品尤物福利片在线观看| 亚洲最大成人免费视频| 国产精品高潮呻吟久久av无限| 在线播放国产精品| 一级做a爰片久久毛片美女图片| 亚洲最大av在线| 日韩精品在线免费观看视频| 国产99视频精品免视看7| 福利微拍一区二区| 日韩在线免费av| 亚洲黄色www网站| 九九热这里只有精品6| 亚洲欧美色婷婷| 尤物九九久久国产精品的特点| 日韩在线视频线视频免费网站| 精品视频www| 欧洲美女免费图片一区| 成人在线视频福利| 国产精品欧美日韩| 欧美激情在线一区| 日韩av电影在线播放| 亚洲色图18p| 久久天天躁狠狠躁夜夜躁2014| 国语自产精品视频在免费| 日韩最新中文字幕电影免费看| 国产91色在线|免| 91久热免费在线视频| 久久精品电影一区二区| 在线看福利67194| 欧美猛交免费看| 亚洲跨种族黑人xxx| 国产精品人人做人人爽| 中文在线不卡视频| 国产成人福利夜色影视| 亚洲aa在线观看| 国产不卡av在线免费观看| 亚洲新声在线观看| 欧美日韩成人在线视频| 亚洲的天堂在线中文字幕| 国产精品亚洲视频在线观看| 成人黄色短视频在线观看| 久久人人爽亚洲精品天堂| 亚洲一区二区福利| 国产日韩精品视频| 国产精品88a∨| 中文字幕日韩电影| 国产亚洲精品va在线观看| 日韩欧美精品免费在线| 欧美另类69精品久久久久9999| 欧美久久精品一级黑人c片| 精品亚洲精品福利线在观看| 亚洲r级在线观看| 国产精品亚洲片夜色在线| 91精品国产91久久| 国产精品大陆在线观看| 欧美日韩成人精品| 51ⅴ精品国产91久久久久久| 欧美孕妇性xx| 久热精品视频在线免费观看| 中文字幕精品www乱入免费视频| 亚洲精品久久久久久久久| 亚洲欧美国产另类| 国产精品入口夜色视频大尺度| 亚洲级视频在线观看免费1级| 亚洲精品久久久久久久久久久久| 久久精品国产2020观看福利| 伊人一区二区三区久久精品| 欧美视频专区一二在线观看| 欧美成在线视频| 亚洲乱码国产乱码精品精天堂| 欧美性高潮床叫视频| 国产精品第三页| 亚洲va欧美va国产综合久久| 国产91精品久久久久久| 欧美乱妇高清无乱码| 91亚洲午夜在线| 亚洲裸体xxxx| 色多多国产成人永久免费网站| 欧美在线一级视频| 欧美福利视频在线观看| 国产精品中文字幕久久久| 日韩欧美精品网址| 国产亚洲精品久久久| 国产精品2018| 日韩美女写真福利在线观看| 国产z一区二区三区| 国产精品99久久久久久白浆小说| 国产婷婷成人久久av免费高清| 国产成人精品在线观看| 亚洲色图35p| 日韩h在线观看| 78色国产精品| 国内精品视频在线| 久久成人一区二区| 91精品国产免费久久久久久| 欧美一级大片在线免费观看| 精品性高朝久久久久久久| 成人在线国产精品| 亚洲国产精品小视频| 美女国内精品自产拍在线播放| 亚洲成色777777女色窝| 96pao国产成视频永久免费| 国产视频精品在线| 色www亚洲国产张柏芝| 欧美在线视频一区二区| 久久精品在线视频| 亚洲精品视频免费在线观看| 亚洲欧美日韩国产中文| 亚洲成年人在线| 亚洲欧美制服丝袜| 午夜精品视频网站| 欧美一区二区三区精品电影| 亚洲精品在线看| 国语自产精品视频在线看一大j8| 国产亚洲人成网站在线观看| 久久精品91久久久久久再现| 成人在线一区二区| 欧美精品videofree1080p| 国产精品视频自在线| 欧美黑人xxxⅹ高潮交| 国产精品久久国产精品99gif| 欧美人与性动交a欧美精品| 国产午夜精品全部视频在线播放| 国产丝袜一区二区| 欧美午夜性色大片在线观看| 成人久久一区二区三区| 日韩中文字幕不卡视频| 亚洲一区二区三区视频| 亚洲激情国产精品| 久久国产精品首页| 欧美性猛交xxxx乱大交| 国产午夜精品免费一区二区三区| 国产精品极品美女粉嫩高清在线| 色综合天天狠天天透天天伊人| 在线日韩欧美视频| 欧美大片大片在线播放| 亚洲国产天堂久久国产91| 精品一区二区三区电影| 日本成人精品在线|