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

首頁 > 編程 > C# > 正文

c#使用dynamic類型優化反射的方法

2019-10-29 19:41:10
字體:
來源:轉載
供稿:網友

什么是dynamic類型?

微軟給出的官方文檔中這樣解釋:在通過 dynamic 類型實現的操作中,該類型的作用是繞過編譯時類型檢查。 改為在運行時解析這些操作。 dynamic 類型簡化了對 COM API(例如 Office Automation API)、動態 API(例如 IronPython 庫)和 HTML 文檔對象模型 (DOM) 的訪問。在大多數情況下,dynamic 類型與 object 類型的行為類似。 但是,如果操作包含 dynamic 類型的表達式,那么不會通過編譯器對該操作進行解析或類型檢查。 編譯器將有關該操作信息打包在一起,之后這些信息會用于在運行時評估操作。 在此過程中,dynamic類型的變量會編譯為 object 類型的變量。 因此,dynamic 類型只在編譯時存在,在運行時則不存在。

dynamic的出現讓C#具有了弱語言類型的特性。編譯器在編譯的時候不再對類型進行檢查,編譯期默認dynamic對象支持你想要的任何特性。

下例中生成的類型是一致的:

dynamic dyn = "Fode";        Object obj = "Fode";// Rest the mouse pointer over dyn and obj to see their // types at compile time. System.Console.WriteLine(dyn.GetType()); System.Console.WriteLine(obj.GetType());

其輸出結果都是String類型,可知CLR可以正確的識別出dynamic是哪種類型,在反編譯看看其生成的IL代碼:

IL_0000: nop IL_0001: ldstr "Fode" IL_0006: stloc.0 IL_0007: ldstr "Fode" IL_000c: stloc.1 IL_000d: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() IL_0012: pop IL_0013: ret

JIT編譯器將dynamic識別為String類型,并將其推算到運算棧中(IL代碼中 ldstr(將新對象引用推送到存儲在元數據中的字符串文字)、(stloc.*)從評估堆棧的頂部彈出當前值,并將其存儲在索引*處的本地變量列表中),不同IL代碼也不所謂,前文只是介紹dynamic這個類型關鍵字,只需要你知道他的類型是繞過編譯器就可以,如以下操作,Object類型就會報編譯的錯誤。但是,對于 dyn + 3,不會報告任何錯誤。 在編譯時不會檢查包含 dyn 的表達式,原因是 dyn 的類型為 dynamic。

  dynamic dyn = "Fode";  Object obj = "Fode";  dyn = dyn + 3;  obj = obj + 3; //這句代碼編譯器會報錯

dynamic是Framework 4.0的新特性。dynamic的出現讓C#具有了若語言的特性。編譯器在編譯時候不再對該類型進行檢查,編譯器默認dynamic對象支持開發者想要的任何特征。比如,即使你對 GetStudent()方法返回的對象一無所知,也可以像以下執行代碼的調用,編譯器不會報錯:

static void Main(string[] args) {  dynamic dyn = GetStudent();  //正確的操作  Console.WriteLine(dyn.Age);  Console.WriteLine(dyn.Name);  dyn.PrintName();  //錯誤的操作  //Console.WriteLine(dyn.Birthday); //該對象沒有包含該屬性  //dyn.PrintAge(); //這行代碼會報錯誤,訪問級別不夠  Console.ReadKey(); } static Student GetStudent() {  Student student = new Student();  student.Age = 21;  student.Name = "Fode";  return student; } class Student {  public String Name { get; set; }  public Int32 Age { get; set; }  public void PrintName()  {  Console.WriteLine(this.Name);  }  private void PrintAge()  {  Console.WriteLine(this.Age);  } }

如果運行時dyn對象不包含指定的特性(屬性、字段、方法等),運行時會拋出一個運行時的錯誤 RuntimeBinderException。

注意:有人可能會將var關鍵字與dynamic進行比較。實際上,var和dynamic完全是兩回事,兩個不同的概念。var實際上是編譯期間拋給我門的“語法糖”,一旦被編譯,編譯器會自動匹配var變量的實際類型,并用實際類型來替換給變量的聲明,這看上去就好像我們在編碼的時候用實際類型進行聲明一樣,優點也顯而易見,當【賦值方】類型發生變化時,【實現方】無需改變其類型,因為var會自動去適配。而dynamic被編譯后,實際上是一個Object類型,只不過編譯器會對dynamic類型進行特殊處理,讓它在編譯期間不進行任何的類型檢查,而是將類型檢查放到了運行期。這從VS這個IDE就能看出,在編輯窗口中,var支持【智能感知】,因為vs能推斷出var類型的實際類型;而dynamic聲明的變量卻不支持【智能感知】,因為對其運行期的類型一無所知。對dynamic變量使用【智能感知】會提示"此操作將在運行時解析"。

BB了這么久,重點來了,利用好了動態類型dynamic的這個特性,可以簡化C#中的反射語法,更高深的優化將在以后的博客推出。在dynamic出現之前,我們先用基礎反射獲取一個類中的方法,并執行它:

static void Main() {  DynamicObj obj = new DynamicObj();  var fun = obj.GetType().GetMethod(nameof(obj.CallFun));  Int32 result = (Int32)fun.Invoke(obj, new Object[] { "Fode" });  Console.WriteLine(result);  Console.ReadKey(); }   public class DynamicObj {  public Int32 CallFun(String str)  {  return str.Length;  } }

其結果沒有什么好講的,就是一個用反射調用 CallFun() 方法的例子,而用dynamic之后,代碼看上去更簡潔了,并且在可控制的范圍內減少了一次拆箱的操作,代碼如下:

 dynamic dyn = new DynamicObj(); Int32 result = dyn.CallFun("Fode"); Console.WriteLine(result);

可能我們會對這樣的簡化不以為然,畢竟代碼看起來并沒有減少多少,但是,如果考慮到效率兼優美兩個特性,那么dynamic的優勢就顯現出來了。對上面的代碼個執行10000000次,在進行分析,如下所示:

CodeTimer.Time("使用dynamic", 10000000, () => { //執行里面的代碼10000000次  dynamic dyn = new DynamicObj();  Int32 result = dyn.CallFun("Fode");  });  CodeTimer.Time("使用基礎反射", 10000000, () => { //執行里面的代碼10000000次  DynamicObj obj = new DynamicObj();  var fun = obj.GetType().GetMethod(nameof(obj.CallFun));  Int32 result = (Int32)fun.Invoke(obj, new Object[] { "Fode" });  });  Console.ReadKey();

其運行結果如下所示:

c#,dynamic,反射

從以上結果看出,使用dynamic使用時間為481ms,基礎反射使用時間為3063ms,CPU和時間上相差了5倍多,測試器 CodeTimer 的代碼隨后會貼出。

總結:

可以看到雖然用dynamic優化后的反射跟基礎反射的相比,效率雖然在同一個數量級上。可是基礎反射卻沒有dynamic代碼簡潔,因此建議:始終使用dynamic來簡化反射實現(前提你知道你要是實現的類型),在往后的隨筆,將會提出用ExpressionTree和Emit技術深度優化反射。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人性生交xxxxx网站| 欧美激情免费在线| 中文字幕在线视频日韩| 国产精品va在线播放| 午夜精品蜜臀一区二区三区免费| 亚洲综合大片69999| 亚洲视频在线播放| 中文字幕在线观看亚洲| 97久久精品人搡人人玩| 久久九九热免费视频| 亚洲区一区二区| 欧美精品在线看| 国产精品福利无圣光在线一区| 91国语精品自产拍在线观看性色| 午夜精品视频网站| 91日本在线视频| 欧美在线视频免费观看| 国产91成人在在线播放| 日韩高清免费在线| 清纯唯美亚洲综合| 欧美精品在线免费播放| 久久综合伊人77777蜜臀| 亚洲石原莉奈一区二区在线观看| 国产欧美一区二区三区久久| 红桃视频成人在线观看| 成人免费视频97| 中文字幕日韩精品在线| 日韩电影中文字幕一区| 久久国产精品久久久久久久久久| 日韩中文字幕精品视频| 国产一区二区日韩精品欧美精品| 日韩美女毛茸茸| 深夜福利亚洲导航| 国产精品久久久久久久9999| 一区二区三区久久精品| 精品无人区乱码1区2区3区在线| 国产精品久久久久久婷婷天堂| 91美女片黄在线观| 91极品女神在线| 精品亚洲一区二区三区四区五区| 精品国内产的精品视频在线观看| 国产亚洲欧洲黄色| 久久影院模特热| 久久91亚洲精品中文字幕奶水| 国产成+人+综合+亚洲欧洲| 久久精品夜夜夜夜夜久久| 色综合亚洲精品激情狠狠| 欧美午夜片在线免费观看| 国产精自产拍久久久久久| 伊人久久五月天| 日韩精品一区二区视频| 97人洗澡人人免费公开视频碰碰碰| 亚洲另类xxxx| 国产精品久久综合av爱欲tv| 国产精品美女网站| 成人精品久久一区二区三区| 欧美一区二区大胆人体摄影专业网站| 亚洲最新视频在线| 7m第一福利500精品视频| 欧美二区在线播放| 久久99精品久久久久久琪琪| 亚洲最大福利网站| 欧美性猛交xxxx免费看| 国产精品免费网站| 日韩国产欧美精品一区二区三区| 国产偷亚洲偷欧美偷精品| 成人免费网站在线观看| 亚洲精品国产综合久久| 国产日韩精品在线播放| 97国产一区二区精品久久呦| 日本sm极度另类视频| 中文字幕精品一区久久久久| 国产成人久久久| 欧美极品美女电影一区| 91社区国产高清| 成人xvideos免费视频| 中文字幕欧美国内| 欧美成人sm免费视频| 精品无人国产偷自产在线| 亚洲欧洲中文天堂| 久久人人爽人人爽人人片av高清| 91成人性视频| 国产在线播放不卡| 欧美精品www在线观看| 久久久久久久国产| 欧美成aaa人片免费看| 国产午夜精品麻豆| 国产成人亚洲综合91精品| xvideos亚洲| 欧美精品一本久久男人的天堂| 91青草视频久久| 久久免费高清视频| 国产精品视频在线播放| 成人h视频在线观看播放| 国产精品99久久久久久久久| 欧美性jizz18性欧美| 欧美另类在线观看| 欧美性xxxxhd| 538国产精品一区二区免费视频| 久久激情视频免费观看| 久久久www成人免费精品张筱雨| 欧美午夜精品久久久久久人妖| 欧美在线免费观看| 国产亚洲一区精品| 成人精品视频99在线观看免费| 2021久久精品国产99国产精品| 91久久久久久| 国产精品美女免费看| 国产精品欧美久久久| 亚洲一区二区日本| 亚洲午夜女主播在线直播| xx视频.9999.com| 亚洲欧美日韩成人| 国产+人+亚洲| 久久亚洲精品小早川怜子66| 久久久999国产精品| 91在线色戒在线| 81精品国产乱码久久久久久| 国产精品一区二区三| 午夜精品国产精品大乳美女| 亚洲精品美女网站| 97久久国产精品| 日韩美女福利视频| 久久久欧美精品| 狠狠久久亚洲欧美专区| 国产视频999| 亚洲人成在线观| 久久九九免费视频| 91免费看片网站| 欧美日韩ab片| 国产精品日韩久久久久| 亚洲精品第一国产综合精品| 热99精品里视频精品| 欧美性videos高清精品| 欧美午夜宅男影院在线观看| 欧美孕妇与黑人孕交| 欧美激情喷水视频| 久久久久久久久久久久久久久久久久av| 97视频在线观看播放| 日韩中文字幕国产| 久久天天躁夜夜躁狠狠躁2022| 亚洲成人性视频| 亚洲跨种族黑人xxx| 亚洲一区二区三区视频| 精品国产欧美一区二区三区成人| 国产精品久久久久av| 最近2019年好看中文字幕视频| 亚洲最大av在线| 亚洲综合中文字幕在线观看| 国产一区深夜福利| 91极品女神在线| 亚洲97在线观看| 中文字幕一区电影| 色综合久久中文字幕综合网小说| 国产精品影院在线观看| 91精品视频在线| 97视频在线观看成人| 久久精品久久久久久国产 免费| 国产精品久久久久久一区二区| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩欧美国产免费播放| 欧美日韩美女视频| 亚洲自拍小视频| 日韩成人小视频|