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

首頁 > 編程 > C# > 正文

C#中ValueTuple的原理詳解

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

前言

本文告訴大家一些 ValueTuple 的原理,避免在使用出現和期望不相同的值。ValueTuple 是 C# 7 的語法糖,如果使用的 .net Framework 是 4.7 以前,那么需要使用 Nuget 安裝System.ValueTuple

雖然 ValueTuple 的很好用,但是需要知道他有兩個地方都是在用的時候需要知道他原理。如果不知道原理,可能就發現代碼和預期不相同

json 轉換

先創建一個項目,然后安裝 Json 解析,使用下面的代碼,在運行之前,先猜一下,下面的代碼會出現什么

   var foo = (name: "lindexi", site: "blog.csdn.net/lindexi_gd");   var str = JsonConvert.SerializeObject(foo);

實際上輸出的是 {"Item1":"lindexi","Item2":"blog.csdn.net/lindexi_gd"}

C#,ValueTuple

那么剛才的命名在哪?

如果想知道,那么請看 ValueTuple 的原理

原理

先來寫一段代碼,編譯之后對他反編譯,看一下他是怎么做的

  static void Main(string[] args)  {   var foo = Foo();   var str = JsonConvert.SerializeObject(foo);   Console.WriteLine(str);  }  static (string name, string site) Foo()  {   return (name: "lindexi", site: "blog.csdn.net/lindexi_gd");  }

不需要安裝反編譯軟件,可以使用這個網站拿到反編譯

可以看到Foo被編譯為 TupleElementNames 特性的兩個字符串

 [return: TupleElementNames(new string[] {  "name",  "site" })] private static ValueTuple<string, string> Foo() {  return new ValueTuple<string, string>("lindexi", "blog.csdn.net/lindexi_gd"); }

所以實際上代碼是 ValueTuple<string, string> 不是剛才定義的代碼,只是通過 TupleElementNames 讓編譯器知道值,所以是語法糖。

IL 代碼是

private hidebysig static valuetype [mscorlib]System.ValueTuple`2<string, string>  Foo() cil managed  { .param [0]  .custom instance void [mscorlib]System.Runtime.CompilerServices.TupleElementNamesAttribute::.ctor(string[])   = (  01 00 02 00 00 00 04 6e 61 6d 65 04 73 69 74 65 // .......name.site 這里就是 return: TupleElementNames 的命名  00 00           // ..  ) .maxstack 2 .locals init (  [0] valuetype [mscorlib]System.ValueTuple`2<string, string> V_0 ) // [20 9 - 20 10] IL_0000: nop    // [21 13 - 21 72] IL_0001: ldstr  "lindexi" IL_0006: ldstr  "blog.csdn.net/lindexi_gd" IL_000b: newobj  instance void valuetype [mscorlib]System.ValueTuple`2<string, string>::.ctor(!0/*string*/, !1/*string*/) IL_0010: stloc.0  // V_0 IL_0011: br.s   IL_0013 // [22 9 - 22 10] IL_0013: ldloc.0  // V_0 IL_0014: ret    }

這個特性只有編譯器可以用,不可以在代碼使用。

在上面的解釋,實際上 IL 不知道存在定義的命名,所以不可以通過這個方法獲得值。

動態類型獲得值

如果希望使用動態類型獲得值,那么下面的代碼實際上會運行出現異常

  static void Main(string[] args)  {   dynamic foo = Foo();   Console.WriteLine(foo.name);  }  static (string name, string site) Foo()  {   return (name: "lindexi", site: "blog.csdn.net/lindexi_gd");  }

運行出現 RuntimeBinderException 異常,因為沒有發現 name 屬性

實際上對比下面匿名類,也就是很差不多寫法。

  dynamic foo = new { name = "lindexi", site = "blog.csdn.net/lindexi_gd" };   Console.WriteLine(foo.name);

運行是可以的,所以在使用動態類型,請不要使用 ValueTuple ,如果需要使用,那么請知道有存在找不到變量異常,而且是在運行才出現異常。

性能提升

如果使用 ValueTuple 編程會有一些優點,性能是其中之一。而且對于異步編程,使用 ValueTuple 可以繼續使用 await 的方法。

假如有一個方法需要返回 5 個參數,那么以前的做法有三個方法,第一個方法是使用 out 的方法,第二個方法是使用 Tuple ,第三個方法是定義一個臨時的類。

如果使用了 out 的方法,那么這個方法就不可以繼續使用異步 await 的方法,因為 await 需要做出狀態機,參見我寫的await原理。如果使用 Tuple ,或這定義一個臨時的類,就會出現性能的問題。

從上面的原理,已經告訴大家,ValueTuple 是值類型,而 Tuple 或定義的一個類不是值類型。編譯器的優化是讓 ValueTuple 分配在棧,對于普通的類分配在堆空間。如果一個類分配到堆空間,那么就需要使用垃圾回收才可以清理空間。而分配到棧就不需要使用垃圾回收,使用完成就清空棧,效率比堆空間大。

但是使用??臻g需要注意,??臻g是很小的,如果使用了大量棧空間可能會出現堆棧gg。因為考慮到部分剛入門的小伙伴,所以我就需要多說一些,上面說的 ValueTuple 使用了??臻g需要小心??臻g不足,和你存放的值的關系不大,而是和定義的 ValueTuple 數量有關,這個數量是非常大的。但是在遞歸方法中,本來是剛好空間足夠的,在使用了 ValueTuple 可能就不夠了。

使用 ValueTuple 可以繼續使用異步,而且不需要垃圾回收,性能比Tuple高,所以建議在多返回參數使用 ValueTuple,而不是定義一個類。

其他需要知道的

不要隨便定義一個看不懂的值

實際上下面的代碼,編譯是可以通過

(int x, (int y, (float a, float b))[] c) f1

但是這個值,在看的時候,幾乎說不出他的屬性

第二個需要知道的,ValueTuple 是值類型,所以他的默認值不是 null 而是 default(xx),在C# 7.2 支持使用關鍵字,所以不需要去寫 defalut(xx,xx)

關于 ValueTuple 變量名的定義也是很難說的,有的小伙伴覺得需要使用 Axx 的方式命名,但是很多小伙伴覺得使用 aaBa 的命名更好,所以暫時對于他的命名使用 aaBa 的方法,大家覺得什么方式好請告訴我

參見: Exploring Tuples as a Library Author

C# 7: Dynamic types and Reflection cannot access Tuple fields by name

總結

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


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人一区二区在线| 亚洲精品久久久久久久久久久久久| 久久91亚洲精品中文字幕奶水| 久久影视电视剧凤归四时歌| 中文字幕久久精品| 亚洲人成网站色ww在线| 国产成+人+综合+亚洲欧美丁香花| 欧美肥老太性生活视频| 欧美午夜宅男影院在线观看| 日韩www在线| 精品国产成人在线| 92国产精品久久久久首页| 日韩在线国产精品| 精品一区二区电影| 欧美高清在线观看| 精品高清美女精品国产区| 一区二区三区亚洲| 曰本色欧美视频在线| 亚洲激情中文字幕| 色偷偷av一区二区三区乱| 亚洲女人初尝黑人巨大| 国产精品69久久| 亚洲最大av在线| 欧美视频在线观看 亚洲欧| 一区二区三区国产在线观看| 国产成人精品在线观看| 欧美专区在线播放| 日韩av网站大全| 亚洲免费一在线| 91国产精品视频在线| 91系列在线播放| 精品色蜜蜜精品视频在线观看| 欧美二区在线播放| 欧美激情免费看| 亚洲已满18点击进入在线看片| 日韩精品在线播放| 日韩成人在线视频网站| 久久九九全国免费精品观看| 日韩精品在线私人| 一区二区三区天堂av| 欧美高清在线播放| 国产精品久久久久久av下载红粉| 亚洲在线免费观看| 国产精品色午夜在线观看| 青草青草久热精品视频在线观看| 色琪琪综合男人的天堂aⅴ视频| 麻豆乱码国产一区二区三区| 久久精品2019中文字幕| 精品少妇v888av| 欧美性猛交99久久久久99按摩| 成人免费福利视频| 亚洲色图第一页| 亚洲男人天堂久| 色香阁99久久精品久久久| 国产精品影片在线观看| 中文字幕精品一区二区精品| 亚洲a级在线播放观看| 日本午夜在线亚洲.国产| www国产精品视频| 国产在线观看一区二区三区| 亚洲一区二区免费在线| 久久全球大尺度高清视频| 欧美激情女人20p| 欧美www视频在线观看| 国产在线播放91| 日韩在线视频线视频免费网站| 国产午夜精品一区二区三区| 日韩精品在线视频美女| 亚洲午夜性刺激影院| 欧美一级大片在线免费观看| 91精品在线观看视频| 久久久久久有精品国产| 中文国产成人精品| 亚洲欧洲日韩国产| 性色av一区二区三区在线观看| 亚洲精品在线观看www| 久久精品夜夜夜夜夜久久| 国产极品精品在线观看| 在线日韩第一页| 国产中文日韩欧美| 久久天堂av综合合色| 欧美性猛交xxxx免费看久久久| 欧美日韩午夜剧场| 亚洲国产精品999| 日韩精品中文字幕在线观看| 2021久久精品国产99国产精品| 欧美性猛交xxxx偷拍洗澡| 国产精品高清在线| 欧美日本在线视频中文字字幕| 国产一区二区三区在线观看视频| 91免费福利视频| 国产精品女主播视频| 精品香蕉在线观看视频一| 国产精品一区二区av影院萌芽| 久久亚洲综合国产精品99麻豆精品福利| 欧美裸体视频网站| 成人欧美一区二区三区黑人孕妇| 97**国产露脸精品国产| 久久久久久久久亚洲| 国产成人亚洲综合91精品| 一区二区亚洲欧洲国产日韩| 成人精品视频在线| 亚洲欧美国产精品va在线观看| 日韩欧美有码在线| 久久不射电影网| 欧美日韩在线免费| 亚洲国产精彩中文乱码av在线播放| 9.1国产丝袜在线观看| 欧美大片免费观看在线观看网站推荐| 精品激情国产视频| 欧美激情2020午夜免费观看| 日韩在线视频观看| 亚洲色图国产精品| 欧美专区在线视频| 国产精品视频不卡| 亚洲国产又黄又爽女人高潮的| 国产精品久久久久久久久久三级| 日韩国产精品视频| 久久国产精品久久久久久| 欧美精品999| 亚洲香蕉在线观看| 国产精品人成电影| 精品久久久国产精品999| 91亚洲精品久久久久久久久久久久| 久久国产加勒比精品无码| 亚洲综合中文字幕在线| 亚洲精品福利视频| 欧美一区三区三区高中清蜜桃| 韩国三级日本三级少妇99| 97福利一区二区| 精品美女国产在线| 亚洲石原莉奈一区二区在线观看| 久久久久久久久久久网站| xvideos国产精品| 国产精品久久久久久久久男| 永久555www成人免费| 91高清视频免费观看| 久久久精品国产网站| 国产精品美女主播在线观看纯欲| 日韩成人小视频| 亚洲va久久久噜噜噜久久天堂| 亚洲精品av在线| 4444欧美成人kkkk| 日韩精品亚洲元码| 中文字幕在线亚洲| 午夜美女久久久久爽久久| 欧美日韩精品中文字幕| 久久电影一区二区| 亚洲毛片在线观看| 国产精品高清在线观看| 久久久久国产一区二区三区| 欧美老女人性视频| 亚洲丝袜在线视频| 欧美日韩免费一区| 最近中文字幕2019免费| 日韩精品视频在线播放| 怡红院精品视频| 日本精品免费一区二区三区| 国产成人久久精品| 国产又爽又黄的激情精品视频| 久久久精品视频成人| 亚洲a中文字幕| 亚洲成人av片在线观看| 精品性高朝久久久久久久|