一:背景
1. 讲故事
最近同事在写一段业务逻辑的时候,程序跑起来总是报:集合已修改;可能无法执行枚举操作
,硬是没有找到什么情况下会导致这个异常产生,就让我来找一下bug,其实这个异常在座的每个程序员几乎都遇到过,谁也不是一生下就是大牛,简单看了下代码,确实是多线程操作foreach,但并没有对foreach进行Add,Remove操作,扫完代码其实我也是有点懵,没撤只能调试了,在foreach里套一层trycatch,查看异常的线程堆栈从而找出了问题代码,代码简化如下:
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;
}
}
先寻找点安慰,说实话,凭肉眼你觉得这段代码会抛出异常吗?反正我是被骗过了,大写的尴尬,结论如下,运行一下便知。
从图中看确实是异常,说明在foreach的过程中连迭代集合的 value 都不可以修改,这让我激起了强