精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Foreach 集合又拋經(jīng)典異常了,這次一定要刨根問(wèn)底

開(kāi)發(fā) 前端
C#已發(fā)展到 9.0 了,到處都充斥著語(yǔ)法糖,有時(shí)候不看一下底層的IL都不知道到底是轉(zhuǎn)化成了什么,所以這個(gè)是必須的。

一、背景

1. 講故事

最近同事在寫(xiě)一段業(yè)務(wù)邏輯的時(shí)候,程序跑起來(lái)總是報(bào):集合已修改;可能無(wú)法執(zhí)行枚舉操作,硬是沒(méi)有找到什么情況下會(huì)導(dǎo)致這個(gè)異常產(chǎn)生,就讓我來(lái)找一下bug,其實(shí)這個(gè)異常在座的每個(gè)程序員幾乎都遇到過(guò),誰(shuí)也不是一生下就是大牛,簡(jiǎn)單看了下代碼,確實(shí)是多線程操作foreach,但并沒(méi)有對(duì)foreach進(jìn)行Add,Remove操作,掃完代碼其實(shí)我也是有點(diǎn)懵,沒(méi)撤只能調(diào)試了,在foreach里套一層trycatch,查看異常的線程堆棧從而找出了問(wèn)題代碼,代碼簡(jiǎn)化如下:

static void Main(string[] args)
        {
            var dict = new Dictionary<int, int>()
            {
                [1001] = 1,
                [1002] = 10,
                [1003] = 20
            };

            foreach (var userid in dict.Keys)
            {
                dict[userid] = dict[userid] + 1;
            }
        }

先尋找點(diǎn)安慰,說(shuō)實(shí)話,憑肉眼你覺(jué)得這段代碼會(huì)拋出異常嗎?反正我是被騙過(guò)了,大寫(xiě)的尷尬,結(jié)論如下,運(yùn)行一下便知。

圖片圖片

從圖中看確實(shí)是異常,說(shuō)明在foreach的過(guò)程中連迭代集合的 value 都不可以修改,這讓我激起了強(qiáng)烈的探索欲,看看FCL中到底是怎么限制的。

二、源碼探索

1. 從IL中尋找答案

C#已發(fā)展到 9.0 了,到處都充斥著語(yǔ)法糖,有時(shí)候不看一下底層的IL都不知道到底是轉(zhuǎn)化成了什么,所以這個(gè)是必須的。

IL_000d: callvirt instance void class [System.Collections]System.Collections.Generic.Dictionary`2<int32, int32>::set_Item(!0, !1)
    IL_001b: callvirt instance void class [System.Collections]System.Collections.Generic.Dictionary`2<int32, int32>::set_Item(!0, !1)
    IL_0029: callvirt instance void class [System.Collections]System.Collections.Generic.Dictionary`2<int32, int32>::set_Item(!0, !1)
    IL_0037: callvirt instance valuetype [System.Collections]System.Collections.Generic.Dictionary`2/KeyCollection/Enumerator<!0, !1> class [System.Collections]System.Collections.Generic.Dictionary`2/KeyCollection<int32, int32>::GetEnumerator()

    .try
    {
        IL_003d: br.s IL_005a
        // loop start (head: IL_005a)
            IL_003f: ldloca.s 1
            IL_0041: call instance !0 valuetype [System.Collections]System.Collections.Generic.Dictionary`2/KeyCollection/Enumerator<int32, int32>::get_Current()
            IL_004c: callvirt instance !1 class [System.Collections]System.Collections.Generic.Dictionary`2<int32, int32>::get_Item(!0)
            IL_0053: callvirt instance void class [System.Collections]System.Collections.Generic.Dictionary`2<int32, int32>::set_Item(!0, !1)
            IL_005a: ldloca.s 1
            IL_005c: call instance bool valuetype [System.Collections]System.Collections.Generic.Dictionary`2/KeyCollection/Enumerator<int32, int32>::MoveNext()
            IL_0061: brtrue.s IL_003f
        // end loop

        IL_0063: leave.s IL_0074
    } // end .try
    finally
    {

    } // end handler

從IL代碼中可以看到,先執(zhí)行了三次字典的索引器操作,然后調(diào)用了 Dictionary.GetEnumerator 來(lái)生成字典的迭代類(lèi),這思路就非常清晰了,然后我們看一下類(lèi)索引器都做了些什么。

圖片圖片

從圖中可以看到,每一次的索引器操作,這里都執(zhí)行了version++,所以字典初始化完成之后,這里的 versinotallow=3,沒(méi)有問(wèn)題吧,然后繼續(xù)看代碼,尋找 Dictionary.GetEnumerator 方法啟動(dòng)迭代類(lèi)。

圖片圖片

上面代碼的 _version = dictionary._version; 一定要看仔細(xì)了,在啟動(dòng)迭代類(lèi)的時(shí)候記錄了當(dāng)時(shí)字典的版本號(hào),也就是_versinotallow=3,然后繼續(xù)探索moveNext方法干了什么,如下圖:

圖片圖片

從圖中可以看到,當(dāng)每次執(zhí)行moveNext的過(guò)程中,都會(huì)判斷一下字典的 version 和 當(dāng)初初始化迭代類(lèi)中的version 版本號(hào)是否一致,如果不一致就拋出異常,所以這行代碼就是點(diǎn)睛之筆了,當(dāng)在foreach體中執(zhí)行了 dict[userid] = dict[userid] + 1; 語(yǔ)句,相當(dāng)于又執(zhí)行了一次類(lèi)索引器操作,這時(shí)候字典的version就變成 4 了,而當(dāng)初初始化迭代類(lèi)的時(shí)候還是3,自然下一次執(zhí)行 moveNext 就是 3 != 4 拋出異常了。

如果你非要讓我證明給你看,這里可以使用dnspy直接調(diào)試源碼,在異常那里下一個(gè)斷點(diǎn)再查看兩個(gè)version版本號(hào)不就知道啦。。。

圖片圖片

2. 面對(duì)疾風(fēng)

有些朋友可能要說(shuō),碼農(nóng)今天分享的這篇一點(diǎn)水準(zhǔn)都沒(méi)有,我18年前就知道字典是不能動(dòng)態(tài)修改的,還分析的頭頭是勁??????。

但是我有話要說(shuō),這個(gè)還確實(shí)是我的一個(gè)盲區(qū),平時(shí)在迭代字典的時(shí)候value一般都是引用類(lèi)型,動(dòng)態(tài)修改引用類(lèi)型的值自然是沒(méi)有問(wèn)題的,這是因?yàn)槟悴还茉趺葱薷亩疾粫?huì)改變 _version 版本號(hào),但質(zhì)疑我的也不要把話說(shuō)的太滿,因?yàn)檫@種操作是非常語(yǔ)義化非常大眾的需求,你能保證后面net版本不支持這個(gè)嗎??? 如果你說(shuō)不可能,那恭喜你,被我?guī)У娇永锩嫒ダ病??????

下面我用原封不動(dòng)的代碼在 .net 5 下跑一次,睜大眼睛好好看哦~~~

圖片圖片

驚訝吧, 居然在 .Net 5 中可以的,接下來(lái)用ILSpy去查查底層源碼,.netcore 3.1 和 net5 中分別對(duì) 類(lèi)索引器 都做了啥修改。

  • netcore 3.1

Path:C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.2\System.Private.CoreLib.dll

圖片圖片

  • net5

Path:C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.0-preview.5.20278.1\System.Private.CoreLib.dll

圖片

對(duì)比兩張圖你會(huì)發(fā)現(xiàn) .Net5 中并沒(méi)有做 _version++ 操作,這就????了,如果你再細(xì)讀代碼,你還發(fā)現(xiàn) .Net5 對(duì)字典進(jìn)行了較大幅度的優(yōu)化,哈哈,當(dāng)初在 .Net5 之前產(chǎn)生的錯(cuò)誤,在 .Net5 中居然沒(méi)有啦!

四、總結(jié)

源碼面前,不談隱私,沒(méi)事多翻翻源碼,有可能還有意外收獲,比如在 .Net 5下的這點(diǎn)新發(fā)現(xiàn),可能還是全網(wǎng)第一個(gè)哦,這要是兩個(gè)大牛爭(zhēng)吵,讓小白去相信誰(shuí)呢,嘿嘿,源碼才是真正的專(zhuān)家!

責(zé)任編輯:武曉燕 來(lái)源: 一線碼農(nóng)聊技術(shù)
相關(guān)推薦

2019-07-04 10:49:13

HTTPWebSocket協(xié)議

2015-07-02 15:04:53

CSS好奇心+

2022-04-20 11:41:45

Kafka數(shù)據(jù)解決方案

2013-10-10 15:41:38

綠色數(shù)據(jù)中心數(shù)據(jù)中心

2012-09-07 09:23:01

Win 8操作系統(tǒng)

2010-03-22 16:51:31

無(wú)線網(wǎng)絡(luò)穩(wěn)定性

2023-02-07 08:36:32

2021-02-09 08:13:51

項(xiàng)目內(nèi)存TCP

2020-11-13 07:14:55

Kafka消息中間件

2019-08-09 11:25:01

Java虛擬機(jī)Java程序員

2022-12-06 09:10:56

KVC原理數(shù)據(jù)篩選

2021-04-27 22:32:18

Python

2019-01-17 09:14:34

2024-05-10 08:10:05

Spring虛擬線程JDK

2010-11-19 16:02:42

IT族

2020-11-23 18:36:21

容器微服務(wù)程序

2025-02-05 14:28:19

2020-04-09 13:38:40

MySQL數(shù)據(jù)庫(kù)臟讀

2011-11-09 14:54:50

Linux操作系統(tǒng)

2022-08-31 22:50:13

JavaScript函數(shù)JSON
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久久久中文字幕亚洲精品| 欧美一区二区三区电影在线观看| xxxx日本少妇| 精品亚洲免a| 在线观看视频一区二区| 久久久久久久久影视| 亚洲 欧美 自拍偷拍| 美女久久久精品| 欧美激情综合色综合啪啪五月| 欧美图片第一页| 精品视频在线观看网站| 欧美日韩亚洲一区二区三区| 伊人久久av导航| 欧美孕妇孕交xxⅹ孕妇交| 激情文学综合插| 欧美怡红院视频一区二区三区| 亚洲熟女毛茸茸| 亚洲日本三级| 日韩精品专区在线影院观看| 国产一级不卡毛片| av中文资源在线资源免费观看| 国产香蕉久久精品综合网| 成人高清在线观看| 这里只有精品免费视频| 国产亚洲精品自拍| 久久99国产精品久久久久久久久| 无码人妻aⅴ一区二区三区69岛| 亚洲一区二区三区日本久久九| 欧美中文字幕一区二区三区亚洲| 久艹在线免费观看| 国产网友自拍视频导航网站在线观看| 久久精品日韩一区二区三区| 国产精品一区二区你懂得| 国产又色又爽又黄又免费| 久久先锋影音| 久久91超碰青草是什么| 一区二区三区影视| 日韩精品免费一区二区在线观看| 国产视频在线观看一区二区| 天天躁日日躁狠狠躁免费麻豆| 精品一区二区三区中文字幕视频| 欧美视频在线一区| www.99在线| 成人在线爆射| 在线一区二区三区做爰视频网站| 欧美日本视频在线观看| heyzo在线欧美播放| 亚洲综合无码一区二区| 男女啪啪免费观看| 影音先锋在线视频| 一区二区三区中文字幕精品精品 | 久久精品99国产| 18aaaa精品欧美大片h| 亚洲一区影音先锋| 成人av在线不卡| 国产美女情趣调教h一区二区| 亚洲色大成网站www久久九九| 伊人久久大香线蕉av一区| 午夜免费播放观看在线视频| 国产精品久久99| 中文字幕一区综合| 在线黄色网页| 亚洲v日本v欧美v久久精品| 国产中文字幕乱人伦在线观看| 九色91在线| 天天做天天摸天天爽国产一区| 男人和女人啪啪网站| 周于希免费高清在线观看| 色综合久久88色综合天天 | 国模冰冰炮一区二区| 日韩欧美国产网站| 亚洲免费一级视频| 国产日韩欧美中文在线| 亚洲第一av在线| 五级黄高潮片90分钟视频| 日韩av在线播放网址| 久久久精品一区二区| 久久一区二区三| 亚洲一区二区成人| 国产精品视频99| 精品国产无码一区二区三区| 成人国产电影网| 欧洲国产精品| 日本高清成人vr专区| 天天综合网 天天综合色| 亚洲中文字幕久久精品无码喷水| 精品裸体bbb| 日韩欧美久久久| 国产精品密蕾丝袜| 欧美 日韩 国产 一区| 性色av一区二区三区免费| 亚洲精品久久久久久久蜜桃| 国产一区二区在线观看免费| 国内外成人免费视频| 黄色大片在线免费观看| 一个色妞综合视频在线观看| 99热成人精品热久久66| 国产乱码精品一区二区三区亚洲人 | 黄页网站在线观看视频| 成人做爰视频www| 欧美xxxx在线观看| 精品人妻中文无码av在线| 欧美福利一区| 国产精品久久久久久久app| 亚洲国产精品一| 亚洲国产高清在线观看视频| 日本一区午夜艳熟免费| 福利一区和二区| 亚洲国产又黄又爽女人高潮的| 麻豆视频免费在线播放| 国产日韩欧美一区在线 | 欧美极品在线视频| 中文在线资源天堂| 99久久99久久久精品齐齐| 亚洲日本精品| 欧美性xxx| 亚洲大胆人体在线| 国产高清在线免费观看| 毛片av一区二区三区| 蜜桃视频日韩| 免费污视频在线| 在线成人高清不卡| 微拍福利一区二区| 国产精品久久久一区二区| 97人人模人人爽人人喊38tv| 一本一道波多野毛片中文在线| 日韩欧美亚洲国产一区| 日本人添下边视频免费| 亚洲最新色图| 成人中文字幕在线观看| av影片在线看| 91高清视频在线| 成都免费高清电影| 欧美亚洲一区二区三区| 精品免费一区二区三区蜜桃| 精精国产xxxx视频在线中文版| 欧美精品一级二级| 国产精品久久国产精麻豆96堂| 久久久久久9| 日本日本精品二区免费| 亚洲国产福利| 亚洲日韩中文字幕| 亚洲欧美日韩激情| 国产亚洲欧美日韩日本| 成人三级视频在线播放 | 国产成人精品免费看| ijzzijzzij亚洲大全| 91国产一区| 麻豆乱码国产一区二区三区| av中文字幕第一页| 亚洲精品第一国产综合野| 欧美一区二区三区影院| 国产在线欧美| 精品国产乱码久久久久软件| sm在线播放| 亚洲欧美国产va在线影院| 国产成人无码专区| 国产精品乱码人人做人人爱 | 国产成人一级片| 久久亚区不卡日本| 免费一级特黄录像| 国产精品久久久久久影院8一贰佰| 国产中文字幕日韩| 日本在线观看高清完整版| 精品国产91洋老外米糕| 国产免费观看av| 欧美激情一二三区| 在线一区二区不卡| 国产精品av久久久久久麻豆网| 国产精品一区二| 91精品影视| 久久好看免费视频| 可以免费观看的毛片| 欧美性xxxxxxx| 精品视频第一页| 国产成人精品影视| 丰满人妻中伦妇伦精品app| 精品久久久久久久| 7777奇米亚洲综合久久 | 日韩欧美成人网| 国产黄a三级三级| 懂色av一区二区三区免费观看| 欧美黑人经典片免费观看| 欧美日本成人| 91网站在线看| www.com.cn成人| 精品国产欧美成人夜夜嗨| 欧洲成人一区二区三区| 在线免费观看视频一区| 黄色一级片在线免费观看| 92国产精品观看| 制服丝袜中文字幕第一页| 亚洲毛片在线| 美女黄色片网站| 国产探花一区| 国产精品成人一区二区三区| 欧亚一区二区| 国内精久久久久久久久久人| av网站在线免费观看| 日韩激情av在线播放| 国产精品国产av| 一本色道久久综合精品竹菊| 久久婷婷国产麻豆91| 国产精品你懂的| 黄色片视频免费观看| 国产一区二区电影| www.xxx亚洲| 亚洲国产午夜| 男女激烈动态图| 人人狠狠综合久久亚洲婷| 国产欧美欧洲| 久久爱www.| 国产精品视频一| 成人美女大片| 国内精品久久久久久| 黄网址在线观看| 中文字幕国内精品| 美国成人毛片| 亚洲国产又黄又爽女人高潮的| 国产亲伦免费视频播放| 欧美三级视频在线观看| 欧美a视频在线观看| 亚洲国产毛片aaaaa无费看 | 一区二区三区国产精华| 日韩区国产区| 蜜桃视频欧美| 欧美极品一区| 亚洲电影一级片| 国产综合18久久久久久| 91精品日本| 99国产在线视频| 国模大尺度视频一区二区| 国产免费成人av| www.国产精品| 国产精品免费福利| 日韩色淫视频| 国产精品午夜视频| 麻豆久久久久| 成人免费自拍视频| 亚洲免费一区| 亚洲中国色老太| 涩爱av色老久久精品偷偷鲁 | 国产成人精品免费视| 国产在线精品一区二区三区| 国产精品18hdxxxⅹ在线| 国产91精品一区二区绿帽| 97se亚洲| 狠狠久久综合婷婷不卡| 日韩欧美影院| 日韩av高清在线播放| 国产区精品区| 一区二区精品免费视频| 91精品99| 国产免费一区二区视频| 国产精品久久久久久模特| 国产综合免费视频| 全国精品久久少妇| 免费看涩涩视频| 国产剧情一区二区三区| 亚洲成人精品在线播放| k8久久久一区二区三区 | 神马影视一区二区| 亚洲精品国产系列| 亚洲国产一成人久久精品| 青青草视频国产| 亚洲伊人观看| 亚洲黄色av网址| 国产一区二区三区蝌蚪| 艳妇乳肉豪妇荡乳xxx| 久久青草国产手机看片福利盒子 | 国产一区香蕉久久| 香蕉免费一区二区三区在线观看| 国产日韩精品一区观看| 狠狠色丁香婷婷综合影院| 中国成人在线视频| 亚洲视频狠狠| mm1313亚洲国产精品无码试看| 久久99精品网久久| 中文字幕第九页| 久久久久国产精品厨房| 国产传媒免费在线观看| 亚洲18女电影在线观看| 综合久久中文字幕| 日韩手机在线导航| 青青草免费在线| 免费av一区二区| 中文字幕在线直播| 91亚洲精品视频| 亚洲深夜福利在线观看| 一区二区三区四区免费观看| 99精品99| 最新av免费在线观看| 91一区二区在线观看| 国产精品久久久免费看| 欧美日韩国产色视频| 国产乱人乱偷精品视频| 亚洲精品有码在线| gogogogo高清视频在线| 日韩av免费一区| 亚洲成人黄色| 亚洲国产精品久久久久久女王| 亚洲二区视频| 亚洲一级片av| 国产日韩亚洲欧美综合| 日本三级片在线观看| 欧美精品高清视频| 国自产拍在线网站网址视频| 欧美福利视频在线| 日韩在线激情| 日本免费高清一区| 国产精品久久久久久模特 | 欧美激情视频一区二区三区不卡 | 国产精品久久久久久久久婷婷| 欧美激情黄色片| 在线免费视频a| 91视频一区二区| 日本a在线观看| 日韩欧美高清dvd碟片| 国产精品久久麻豆| 国产精品自产拍在线观看| 综合亚洲自拍| 激情五月宗合网| 粉嫩嫩av羞羞动漫久久久| 天海翼在线视频| 666欧美在线视频| 色大18成网站www在线观看| 热久久这里只有精品| 久久99精品国产自在现线| 欧美日韩视频免费| 国产高清在线观看免费不卡| 欧美另类videoxo高潮| 欧美日韩电影一区| 日本在线观看视频| 国产精品夜色7777狼人| 成人在线免费观看视频| 日本精品久久久久中文字幕| 91视频你懂的| 午夜精品一区二| 亚洲欧美日韩一区二区在线| 亚洲国产欧美日本视频| 欧美精品一区二区三区在线四季| 国产日韩一区| 91精品人妻一区二区| 欧美午夜激情小视频| 四虎影视精品成人| 91大神福利视频在线| 欧美成人专区| 日本中文字幕片| 中日韩av电影| 国产又粗又大又爽| 九九精品在线视频| 国产一区二区三区亚洲| 国产精品宾馆在线精品酒店| 26uuu另类欧美| 国产精品无码一区| 精品国产一区二区三区四区在线观看| 伊人久久大香| 毛片av在线播放| 99久久99久久综合| 中文字幕av第一页| 日韩三级影视基地| 深夜激情久久| 国产乱子伦农村叉叉叉| 国产亚洲欧美日韩日本| 国产麻豆精品一区| 久久久久国产精品www| 国产videos久久| 日本国产一级片| 亚洲va欧美va国产va天堂影院| 亚洲av片一区二区三区| 国产国语videosex另类| 99久久99视频只有精品| 激情av中文字幕| 色www精品视频在线观看| 在线观看a视频| 国产精品视频一区二区三区经| 免费看的黄色欧美网站| av资源在线免费观看| 日韩精品中午字幕| 国产v综合v| 日本一道在线观看| 久久亚洲精品小早川怜子| 国产毛片毛片毛片毛片毛片| 午夜精品久久久久久久99热| 精品久久久久久久久久久下田| 九九热精品国产| 欧美日韩黄色大片| 老司机av在线免费看| 精品在线观看一区二区| 精品一区二区日韩| 日本道在线观看| 久久久999精品| 亚洲电影男人天堂| 免费观看一区二区三区| 色94色欧美sute亚洲线路二| 在线中文免费视频| 亚洲福利av| 91在线视频播放地址| 国产精品综合在线| 国产成人综合精品|