日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Foreach 集合又拋經典異常了,這次一定要刨根問底

來源: 責編: 時間:2024-07-09 07:04:57 238觀看
導讀一、背景1. 講故事最近同事在寫一段業務邏輯的時候,程序跑起來總是報:集合已修改;可能無法執行枚舉操作,硬是沒有找到什么情況下會導致這個異常產生,就讓我來找一下bug,其實這個異常在座的每個程序員幾乎都遇到過,誰也不是一

一、背景

1. 講故事

最近同事在寫一段業務邏輯的時候,程序跑起來總是報:集合已修改;可能無法執行枚舉操作,硬是沒有找到什么情況下會導致這個異常產生,就讓我來找一下bug,其實這個異常在座的每個程序員幾乎都遇到過,誰也不是一生下就是大牛,簡單看了下代碼,確實是多線程操作foreach,但并沒有對foreach進行Add,Remove操作,掃完代碼其實我也是有點懵,沒撤只能調試了,在foreach里套一層trycatch,查看異常的線程堆棧從而找出了問題代碼,代碼簡化如下:8ZK28資訊網——每日最新資訊28at.com

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;            }        }

先尋找點安慰,說實話,憑肉眼你覺得這段代碼會拋出異常嗎?反正我是被騙過了,大寫的尷尬,結論如下,運行一下便知。8ZK28資訊網——每日最新資訊28at.com

圖片圖片8ZK28資訊網——每日最新資訊28at.com

從圖中看確實是異常,說明在foreach的過程中連迭代集合的 value 都不可以修改,這讓我激起了強烈的探索欲,看看FCL中到底是怎么限制的。8ZK28資訊網——每日最新資訊28at.com

二、源碼探索

1. 從IL中尋找答案

C#已發展到 9.0 了,到處都充斥著語法糖,有時候不看一下底層的IL都不知道到底是轉化成了什么,所以這個是必須的。8ZK28資訊網——每日最新資訊28at.com

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代碼中可以看到,先執行了三次字典的索引器操作,然后調用了 Dictionary.GetEnumerator 來生成字典的迭代類,這思路就非常清晰了,然后我們看一下類索引器都做了些什么。8ZK28資訊網——每日最新資訊28at.com

圖片圖片8ZK28資訊網——每日最新資訊28at.com

從圖中可以看到,每一次的索引器操作,這里都執行了version++,所以字典初始化完成之后,這里的 versinotallow=3,沒有問題吧,然后繼續看代碼,尋找 Dictionary.GetEnumerator 方法啟動迭代類。8ZK28資訊網——每日最新資訊28at.com

圖片圖片8ZK28資訊網——每日最新資訊28at.com

上面代碼的 _version = dictionary._version; 一定要看仔細了,在啟動迭代類的時候記錄了當時字典的版本號,也就是_versinotallow=3,然后繼續探索moveNext方法干了什么,如下圖:8ZK28資訊網——每日最新資訊28at.com

圖片圖片8ZK28資訊網——每日最新資訊28at.com

從圖中可以看到,當每次執行moveNext的過程中,都會判斷一下字典的 version 和 當初初始化迭代類中的version 版本號是否一致,如果不一致就拋出異常,所以這行代碼就是點睛之筆了,當在foreach體中執行了 dict[userid] = dict[userid] + 1; 語句,相當于又執行了一次類索引器操作,這時候字典的version就變成 4 了,而當初初始化迭代類的時候還是3,自然下一次執行 moveNext 就是 3 != 4 拋出異常了。8ZK28資訊網——每日最新資訊28at.com

如果你非要讓我證明給你看,這里可以使用dnspy直接調試源碼,在異常那里下一個斷點再查看兩個version版本號不就知道啦。。。8ZK28資訊網——每日最新資訊28at.com

圖片圖片8ZK28資訊網——每日最新資訊28at.com

2. 面對疾風

有些朋友可能要說,碼農今天分享的這篇一點水準都沒有,我18年前就知道字典是不能動態修改的,還分析的頭頭是勁

本文鏈接:http://m.www897cc.com/showinfo-26-99653-0.htmlForeach 集合又拋經典異常了,這次一定要刨根問底

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 隱藏在前端工程師職責背后的那些事

下一篇: 中老鐵路國際旅客列車開行滿 1000 列次,累計發送旅客超 96 萬人次

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲男人影院| 亚洲精品久久在线| 欧美三级资源在线| 国产精品vip| 国产深夜精品福利| 亚洲电影天堂av| 一本大道av伊人久久综合| 亚洲午夜未删减在线观看| 性感少妇一区| 欧美aⅴ99久久黑人专区| 欧美日韩第一页| 国产欧美日韩亚洲一区二区三区| 国内精品久久久久久| 亚洲高清一区二区三区| 一本久道综合久久精品| 久久电影一区| 欧美国产高清| 国产精品一区二区三区乱码| 黄色日韩精品| 一区二区三区日韩精品| 久久久999成人| 欧美精品在线观看| 国产视频亚洲| 99热免费精品在线观看| 在线观看视频日韩| 亚洲一区二区三区精品在线观看| 久久精品中文| 欧美视频久久| 亚洲第一色在线| 亚洲自拍偷拍网址| 欧美成人一区二免费视频软件| 国产精品欧美久久久久无广告| 亚洲电影视频在线| 亚洲男人第一av网站| 欧美大色视频| 国产欧美日韩另类一区| 亚洲国产91精品在线观看| 中文精品视频| 欧美99久久| 国产一区二区三区日韩| 亚洲视频在线观看网站| 欧美承认网站| 黄网动漫久久久| 亚洲一区二区三区免费观看| 欧美高清在线一区二区| 国内激情久久| 欧美一级久久久久久久大片| 欧美日韩精品系列| 亚洲国产精品一区二区久| 亚洲欧美日韩精品久久奇米色影视 | 韩国av一区二区三区在线观看 | 美女诱惑黄网站一区| 国产日韩欧美一区| 亚洲一区二区精品在线| 欧美精品在线一区| 亚洲福利视频一区二区| 欧美中文字幕视频在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲欧洲一区二区在线播放| 久久久久在线观看| 国产日韩欧美精品在线| 亚洲欧美国产另类| 国产精品狠色婷| 亚洲视频欧美视频| 欧美色123| 这里只有精品在线播放| 欧美日韩麻豆| 一本色道久久综合| 欧美日韩精品一本二本三本| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲女ⅴideoshd黑人| 欧美日韩免费观看一区二区三区| 亚洲国产精品欧美一二99| 美女诱惑黄网站一区| 伊大人香蕉综合8在线视| 欧美中文字幕在线观看| 国产一区二区三区高清在线观看 | 麻豆精品在线播放| 在线免费观看一区二区三区| 久久久久久网址| 好看不卡的中文字幕| 久久成人羞羞网站| 国产综合网站| 久久人人爽人人| 亚洲成人在线| 能在线观看的日韩av| 一区二区三区在线免费观看| 久久久精品2019中文字幕神马| 国产在线播精品第三| 久久久99国产精品免费| 一色屋精品视频免费看| 女女同性女同一区二区三区91| 91久久精品网| 欧美日韩国产在线一区| 国产精品99久久久久久久vr| 国产精品乱人伦一区二区| 亚洲欧美在线免费观看| 国产视频久久久久久久| 久久久一二三| 亚洲欧洲精品一区二区三区| 欧美巨乳波霸| 亚洲天堂黄色| 国产亚洲福利| 免费亚洲婷婷| 亚洲最新合集| 国产精品视频免费| 久久久国产视频91| 亚洲国产成人精品女人久久久| 欧美黄色影院| 中文av一区特黄| 国产目拍亚洲精品99久久精品| 欧美在线地址| 亚洲高清影视| 欧美日韩亚洲一区二区三区在线观看 | 91久久在线播放| 欧美日韩精品综合在线| 午夜老司机精品| 精品成人在线观看| 欧美人与性动交a欧美精品| 亚洲综合色视频| 激情综合在线| 欧美精品大片| 性欧美1819性猛交| **欧美日韩vr在线| 欧美三级网址| 久久久99精品免费观看不卡| 亚洲日本中文字幕| 国产精品日本精品| 裸体歌舞表演一区二区| 正在播放欧美视频| 黄色av日韩| 欧美色视频一区| 久久精品网址| 999亚洲国产精| 国产亚洲精品v| 欧美黄色影院| 久久精品中文字幕一区| 日韩一级黄色片| 国产一区视频网站| 欧美片在线观看| 久久国产综合精品| 一区二区三区四区蜜桃| 黄色成人av在线| 国语精品中文字幕| 欧美日韩精品一区二区三区四区| 欧美在线免费观看亚洲| 亚洲精品永久免费精品| 国产婷婷色综合av蜜臀av| 欧美激情一区二区三区在线视频观看 | 国产日韩精品入口| 久久精品人人做人人爽| 99这里只有精品| 伊人狠狠色j香婷婷综合| 欧美性天天影院| 欧美aa在线视频| 欧美一区二区高清| 中文精品视频| 亚洲国产精品激情在线观看| 国产精品永久在线| 欧美日韩亚洲一区二区| 久久综合久久久久88| 性做久久久久久久久| 99国产精品久久久久久久久久| 黄色一区二区在线| 国产精品久久久久国产精品日日| 美女脱光内衣内裤视频久久网站| 亚洲男人第一网站| 一区二区三区产品免费精品久久75 | 裸体一区二区三区| 亚洲欧美色一区| 亚洲美女性视频| 在线观看欧美黄色| 国产香蕉久久精品综合网| 欧美视频一区二区| 欧美激情1区2区| 免费av成人在线| 久久青草欧美一区二区三区| 欧美在现视频| 欧美一区二区三区四区在线观看地址 | 一本大道久久a久久精二百| 在线观看欧美日韩国产| 国产亚洲精品bt天堂精选| 国产精品久久久久久久久免费| 欧美日韩在线大尺度| 欧美男人的天堂| 欧美连裤袜在线视频| 欧美激情va永久在线播放| 免费亚洲电影在线观看| 久久亚洲综合网| 久久日韩粉嫩一区二区三区| 久久久蜜臀国产一区二区| 久久精品导航| 久久精品国产清高在天天线| 欧美在线一二三| 久久爱www久久做| 久久国产精品72免费观看| 欧美一区日韩一区| 欧美一区二区三区四区高清| 亚洲欧美日韩精品久久久| 亚洲欧美激情精品一区二区| 亚洲欧美成人| 午夜久久久久久| 欧美一区在线视频| 久久动漫亚洲|