精品欧美一区二区三区在线观看 _久久久久国色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)

牛牛澡牛牛爽一区二区| 九九热久久免费视频| 91精品国产黑色瑜伽裤| 北条麻妃国产九九精品视频| 88xx成人精品| 欧美激情亚洲色图| 综合久草视频| 性做久久久久久久久| 久久九九视频| 中文字幕久久久久| 欧美永久精品| 亚洲男人第一av网站| 一女二男3p波多野结衣| 激情影院在线| 欧美激情一区不卡| 91免费国产视频| 日韩av综合在线| 国内精品久久久久久久影视简单 | 亚洲激情不卡| 国产性猛交xxxx免费看久久| 91精产国品一二三| 欧美黄色三级| 亚洲国产成人porn| 午夜一区二区三视频在线观看| 国产av一区二区三区| 久久精品一区二区三区中文字幕| 精品久久久91| 中文字幕在线看高清电影| 国产精品一区三区在线观看| 欧美日韩综合视频网址| 永久免费在线看片视频| 国模吧精品人体gogo| 东方欧美亚洲色图在线| 国产欧美日韩精品专区| 中文字幕在线观看免费视频| 国产精品99在线观看| 精品亚洲一区二区三区| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | av日韩亚洲| 一级女性全黄久久生活片免费| 日韩中文字幕av在线| 香蕉视频黄在线观看| 福利电影一区二区三区| 成人h视频在线| 日批视频免费在线观看| 亚洲日韩视频| 欧美黑人狂野猛交老妇| 国产综合精品久久久久成人av| 欧美亚洲国产日韩| 精品久久久久久久一区二区蜜臀| 国产成人美女视频| 成人午夜一级| 日本韩国一区二区| 国产91xxx| www.8ⅹ8ⅹ羞羞漫画在线看| 亚洲精品国产成人久久av盗摄| 艳色歌舞团一区二区三区| 欧美少妇另类| 久久精品视频一区二区| 久久五月天婷婷| 欧美天堂在线视频| 成人午夜电影小说| 国产精品久久久久久久久久久久午夜片 | 少妇又色又爽又黄的视频| 国产精品自拍三区| 亚洲综合在线做性| 国产欧美一区二区三区视频在线观看| 美女免费视频一区二区| 国产精品久久久久久av下载红粉 | 亚洲做受高潮无遮挡| 久久综合五月婷婷| 日韩激情在线视频| 五月婷婷综合在线观看| 亚洲区小说区图片区qvod按摩| 日韩精品视频免费| 欧美一区二区三区成人精品| 亚洲精品456| 亚洲精品丝袜日韩| 久久精品—区二区三区舞蹈 | 亚洲国产成人在线视频| 影音先锋黄色资源| 五月激激激综合网色播| 国产亚洲欧美视频| 亚洲aaa视频| 伊人青青综合网| 欧美激情视频网站| 欧美一区二区三区四| 久久久精品五月天| 国产在线观看一区二区三区 | 欧美精品一区在线观看| 91黄色免费视频| 国产一区二区亚洲| 免费不卡在线观看av| 国产一级一级片| 免费在线亚洲| 国产精品专区一| 亚洲成人黄色片| 91小视频在线| 亚洲欧美日韩精品久久久| 中文字幕有码在线观看| 五月综合激情婷婷六月色窝| 日韩亚洲在线视频| 日韩成人在线观看视频| 亚洲免费成人av电影| 91av手机在线| 亚洲日本欧美| 国产免费观看久久黄| 亚洲女同志亚洲女同女播放| 2020国产成人综合网| 亚洲无玛一区| 国产天堂在线播放视频| 91成人免费在线视频| 少妇献身老头系列| 秋霞欧美视频| 国内精品视频一区| 中文字幕一区二区三区四区视频| 国产福利精品一区| 日韩精品成人一区二区在线观看| a天堂中文在线官网在线| 一本大道久久a久久精二百 | 国产a亚洲精品| 欧美不卡视频一区| 内射毛片内射国产夫妻| 亚洲国产黄色| 成人性生交大片免费看视频直播 | 国产精品羞羞答答xxdd| 欧美精品亚洲精品| 欧美1—12sexvideos| 欧美视频中文一区二区三区在线观看| 香蕉视频污视频| 91精品福利| 国产精品视频大全| 色视频免费在线观看| 亚洲精品高清在线| 国产精品自在自线| 国产成人精品一区二区免费看京| 久久久久这里只有精品| 97在线视频人妻无码| 国产拍欧美日韩视频二区| koreanbj精品视频一区| 蜜桃在线一区| 日韩在线观看av| 国产主播第一页| 白白色 亚洲乱淫| 免费观看亚洲视频| 国产激情一区| 日韩资源在线观看| 最近中文字幕免费在线观看| 久久精品一区二区三区不卡牛牛| 日韩人妻无码精品久久久不卡| 国产精品99久久免费| 精品国产一区久久久| 中文字幕一二区| 久久午夜免费电影| 亚洲乱码中文字幕久久孕妇黑人| 久久av国产紧身裤| 久久久免费在线观看| 成人久久久精品国产乱码一区二区| 自拍偷拍亚洲综合| 日韩精品视频网址| 在线成人激情| 91九色偷拍| 男女在线视频| 精品少妇一区二区三区| 久草精品视频在线观看| 懂色中文一区二区在线播放| www.欧美黄色| 东京久久高清| 欧美亚洲激情视频| 国产无套粉嫩白浆在线2022年| 色综合天天综合网国产成人综合天 | 91精品国产乱| 黄色一级片在线免费观看| 国产精品123| 日韩精品在线视频免费观看| 国产精品对白久久久久粗| 7m精品福利视频导航| 国产系列在线观看| 欧美日韩精品一区二区三区蜜桃 | 免费看黄色一级视频| 亚洲高清久久久| 中文字幕一二三四区| 日本女人一区二区三区| 一区二区三区四区在线视频| 国产一区二区久久久久| 久久人91精品久久久久久不卡| 香蕉人妻av久久久久天天| 欧洲亚洲精品在线| 成人自拍小视频| av在线不卡网| 亚洲精品高清无码视频| 亚洲精品99| 久久精品国产综合精品| 国产69精品久久久久9999人| 九九热r在线视频精品| 色视频免费在线观看| 欧美主播一区二区三区| 美女福利视频在线观看| 91麻豆国产在线观看| 女同激情久久av久久| 亚洲高清久久| 亚洲电影一二三区| 999在线精品| 国产精品av在线播放| av网站大全在线| 亚洲精品99久久久久| 在线观看毛片av| 亚洲一区在线观看网站| 黄免费在线观看| 国产91在线|亚洲| 美女网站免费观看视频| 狠狠88综合久久久久综合网| 色一情一乱一伦一区二区三区丨| 在线日韩成人| 国产精品稀缺呦系列在线| 91九色美女在线视频| 日韩中文字幕国产精品| 三级无遮挡在线观看| 日韩一二三四区| 亚洲无码精品一区二区三区| 亚洲无线码一区二区三区| 91麻豆制片厂| 99re热这里只有精品视频| 色婷婷激情视频| 久久久精品性| av免费观看大全| 综合激情婷婷| 神马影院午夜我不卡| 最新国产精品精品视频| 国产精品丝袜久久久久久不卡| 高潮在线视频| 久久99热精品这里久久精品| 五月天婷婷在线视频| 亚洲欧美制服中文字幕| 亚洲国产精品久久久久久久| 7777精品久久久大香线蕉| 免费观看日批视频| 精品久久久一区| 日本在线观看中文字幕| 亚洲一级二级三级在线免费观看| 久久高清内射无套| 国产精品久久久久久久午夜片| 国产精品久久久久无码av色戒| 成人a区在线观看| 自拍视频第一页| 国产综合色产在线精品| 日本高清一区二区视频| 奇米色一区二区| 亚洲成人av免费看| 日日摸夜夜添夜夜添亚洲女人| 国产日韩一区二区在线| 亚洲伊人观看| 日本一本二本在线观看| 国产精品一二| 欧美黑人经典片免费观看| 亚洲精品美女91| 国产真人做爰毛片视频直播| 国产精品99免费看| 国内少妇毛片视频| 激情欧美亚洲| 黄页免费在线观看视频| 亚洲免费网站| 成年人视频在线免费| 日日嗨av一区二区三区四区| 亚洲精品一二三四五区| 日韩av一区二| 亚洲三级在线观看视频| 国产一区二区视频在线| 一二三区视频在线观看| 不卡视频免费播放| 成人无码www在线看免费| 久久精品视频免费观看| 久久久久久久久福利| 中文字幕一区二区三区四区| 中文字幕电影av| 亚洲大片一区二区三区| 黄色在线免费观看| 欧美羞羞免费网站| 国产精品久久777777换脸| 欧美大片在线观看一区二区| 无码精品一区二区三区在线| 亚洲人成电影在线播放| 麻豆影院在线| 欧美日韩国产91| 在线视频超级| 成人福利网站在线观看| 2023国产精华国产精品| 欧美精品一区二区三区四区五区| av影片在线一区| 男人草女人视频| 亚洲综合精品四区| 一区二区三区欧美精品| jizz一区二区| 一二三四国产精品| 亚洲在线免费播放| 无码人妻精品一区二区| 日韩一级高清毛片| 欧美巨乳在线| 超碰91人人草人人干| 欧亚av在线| 成人在线精品视频| 欧美freesex8一10精品| 一区二区成人国产精品 | 91蜜桃网址入口| 男人的午夜天堂| 午夜欧美2019年伦理| 中文字幕人成人乱码亚洲电影| 日韩女优av电影| 风间由美一区| 欧美激情视频一区二区三区不卡| 欧洲一级精品| 成人三级在线| 手机在线电影一区| 精品无码一区二区三区在线| 另类小说一区二区三区| 国产精品无码电影| 综合亚洲深深色噜噜狠狠网站| 国产原创视频在线| 欧美不卡视频一区| 三区四区在线视频| 欧美在线欧美在线| 一区二区网站| 在线一区日本视频| 久久亚洲电影| 性囗交免费视频观看| 亚洲欧美日韩在线| 日韩中文字幕高清| 亚洲精品久久久久中文字幕二区| www在线观看播放免费视频日本| 日韩免费不卡av| av成人资源| 欧美 日韩 国产精品| 九一九一国产精品| 女人黄色一级片| 色偷偷久久人人79超碰人人澡| 好吊色一区二区三区| 欧美成人精品h版在线观看| 日韩欧美2区| 日本一区二区三区免费观看| 国产农村妇女精品一二区| 2一3sex性hd| 亚洲成a人片在线不卡一二三区 | 欧美自拍资源在线| 国产婷婷精品| 一起草在线视频| 亚洲不卡在线观看| 丰满熟妇乱又伦| 欧美激情一二三| 亚洲一区二区三区免费| 可以在线看黄的网站| 国产一区免费电影| 国产精品视频一区二区在线观看| 欧美日韩aaa| 毛片在线看网站| 91影院在线免费观看视频| 91免费精品| 五月六月丁香婷婷| 亚洲精品欧美在线| 国产女人高潮的av毛片| 插插插亚洲综合网| 亚洲一二三区视频| 欧美乱大交xxxxx潮喷l头像| 99re6这里只有精品视频在线观看| 日韩欧美大片在线观看| 精品亚洲一区二区| 日本精品在线中文字幕| 四虎永久在线精品免费一区二区| 日韩不卡免费视频| 又色又爽的视频| 91精品国产综合久久久久久久久久 | 日本中文字幕在线免费观看| 亚洲黄色av女优在线观看| 97在线超碰| 欧美精品一区二区三区久久| 美腿丝袜在线亚洲一区| 国产大屁股喷水视频在线观看| 7777精品久久久大香线蕉| 日本电影在线观看| 国模精品娜娜一二三区| 欧美一级专区| 老司机福利在线观看| 日韩一区二区在线看| 久草在线资源站手机版| 欧美二区三区| 久久精品国产77777蜜臀| 青青草在线观看视频| 亚洲精品电影网站| 欧美日韩精品一区二区三区视频| a级网站在线观看| 成人毛片在线观看| 男人的天堂av网站| 久久国产精品99国产精| 日日狠狠久久偷偷综合色| 依人在线免费视频| 亚洲成av人**亚洲成av**| 国产高清美女一级毛片久久| 亚洲一区二区三区久久| 亚洲欧美网站| 艳妇荡乳欲伦69影片| 日韩经典中文字幕在线观看|