.Net 5 新特性之--支持字典在迭代中进行修改

我们都知道以前字典迭代中是不支持动态修改的【否则会报错::“Collection was modified; enumeration operation may not execute.”--
集合已修改 无法进行操作】 但.Net 5将支持字典迭代中的动态修改 详情见下

  • 首先创建一个Dictionary 并尝试迭代中进行修改
 var dict = new Dictionary<int, int>()
            {
                [1001] = 1,
                [1002] = 10,
                [1003] = 20
            };

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

.Net 5之前

  • 通过ILSpy我们查看一下源码
    • 首先创建Dictionary 并插入数据 注意 _version 这个变量 这将是判断集合是否可迭代中修改的关键
    • 接着继续查看源码 进入迭代
    • 迭代中 尝试修改字典
    • 综上可以发现 .Net 5之前 迭代中不能修改字典 是因为当尝试修改字典时 会调用字典的索引器操作 造成 _version++ 从而在 .MoveNext()时判断出错 抛异常

.Net 5

  • .Net 5中是支持这种修改的 区别就在于上述操作的第二步 见图
    • 操作字典-version保持不变 因此不会出现异常 代码正常运行 实现了迭代中修改字典的操作
posted @ 2020-06-15 14:29  C余L小R鱼  阅读(179)  评论(0编辑  收藏  举报