字典方法 Remove 和 Clear (.NET Core) 在枚举期间修改集合。没有抛出异常

2023-11-22

我正在尝试实现一个缓存机制安全地枚举集合,并且我正在检查内置集合的所有修改是否都会触发InvalidOperationException由各自的枚举器抛出。我注意到在 .NET Core 平台中Dictionary.Remove and Dictionary.Clear方法不会触发此异常。这是一个错误还是一个功能?

示例为Remove:

var dictionary = new Dictionary<int, string>();
dictionary.Add(1, "Hello");
dictionary.Add(2, "World");
foreach (var entry in dictionary)
{
    var removed = dictionary.Remove(entry.Key);
    Console.WriteLine($"{entry} removed: {removed}");
}
Console.WriteLine($"Count: {dictionary.Count}");

Output:

[1,你好] 已删除:True
[2,世界] 已删除:真实
数量:0

示例为Clear:

var dictionary = new Dictionary<int, string>();
dictionary.Add(1, "Hello");
dictionary.Add(2, "World");
foreach (var entry in dictionary)
{
    Console.WriteLine(entry);
    dictionary.Clear();
}
Console.WriteLine($"Count: {dictionary.Count}");

Output:

[1、你好]
数量:0

预期的异常是:

InvalidOperationException:集合已修改;枚举操作可能无法执行。

...正如该方法抛出的那样Add,并在 .NET Framework 中使用相同的方法。

.NET Core 3.0.0、C# 8、VS 2019 16.3.1、Windows 10


这似乎是 .Net 完整框架和 .Net core 之间的有意差异Dictionary<TKey, TValue>.

分歧发生在Pull #18854:从 Dictionary.Remove 重载中删除版本增量:

从删除操作中删除版本增量

这解决了 api 更改的 coreclr 方面的问题添加字典.删除(谓词)目的是允许从字典中删除项目,同时从 @jkotas 枚举每个方向。所有集合测试以及相关 corefx PR 中添加的修改和新测试。

似乎存在一个开放文档问题:

问题#42123:澄清枚举过程中围绕突变的字典行为/保证:

说Dictionary的当前实现支持迭代过程中的非并发变异是否正确?

只能去除。这是作为一项功能启用的点网/coreclr#18854.

这是未来可以依赖的东西吗

Yes.

我们应该确保更新文档以反映这一点。

您可能希望对请求澄清的开放文档问题添加投票,因为.Net core 3.0 文档Dictionary<TKey,TValue>.GetEnumerator() is now obsolete:

如果对集合进行更改,例如添加、修改或deleting元素,枚举器将不可恢复地失效,并且下一次调用MoveNext or IEnumerator.Reset抛出一个InvalidOperationException.

奇怪的是,枚举器SortedDictionary<TKey, TValue> does当字典在枚举过程中被修改时抛出。

Demos:

  • .Net框架Remove(): https://dotnetfiddle.net/8vONOw(投掷)。
  • .Net核心Remove(): https://dotnetfiddle.net/es6STm(不抛出)。
  • .Net核心Add(): https://dotnetfiddle.net/6q7Lvx(投掷)。
  • .Net核心Remove() from SortedDictionary<int, string>: https://dotnetfiddle.net/bssrG7(投掷)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字典方法 Remove 和 Clear (.NET Core) 在枚举期间修改集合。没有抛出异常 的相关文章

随机推荐

  • 在 Python 中使用对象 id 作为对象的哈希值

    使用该对象是否明智id作为哈希键 通过 hash 能够为程序的单个实例对可变对象进行哈希处理 使用对象属性会更好 但它们都是可变的并且可以更改 我在看时想到了这一点实例集我想知道这是否明智 是的 只要您还定义 eq 并且大概 ne 与此一致
  • 并行流非并发无序收集器

    假设我有这个自定义收集器 public class CustomToListCollector
  • WPF:如何从 Fonts.SystemFontFamilies 中过滤掉非罗马字体?

    我知道如何使用几行 XAML 创建一个 WPF 字体选择器 绑定到Fonts SystemFontFamilies 感谢 Norris Cheng 的精彩博客文章 但我不知道如何过滤掉所有国际和其他非罗马字母字体系列 我的用户不太可能需要
  • Roxygen 真的可以像 Doxygen 对 C++ 那样记录 R 脚本(而不是包)吗?

    Roxygen 的灵感来自 C C 程序员使用的 Doxygen 文档系统 我使用过 Doxygen 我发现只要有 doxygen 注释 记录任何程序都非常容易 它还生成函数和类的调用图 我认为 roxygen 会以同样的方式工作 但是当我
  • Grails sql 查询

    想象一下我有这样的东西 def example def temp ConferenceUser findAllByUser User get session user temp temp 解释我的问题 虽然动态查找器非常易于使用且学习速度很
  • 如何在Python中获取文本字符串的视觉长度

    如同这个问题 我不是问如何查找字符串中的字符数 我想确定渲染时字符串的视觉长度或将其与另一个字符串进行比较 例如 iiii 和 WWWW 都有四个字符 然而 iiii 在视觉上更短 我知道这是由字体决定的 并且我不使用等宽字体 因此 为了解
  • 如何修改运行时加载的 DLL 的导入地址表

    我想挂钩在运行时从加载的 DLL 调用的函数 我使用了 Windows Via C C 一书中的 CAPIHook 类 DLL 注入由 Install System Wide hook 完成 The hooking 由修改 IAT 完成 但
  • 如何填充 UIView 的背景图片

    我有一个UIView我这样设置背景图片 self view backgroundColor UIColor colorWithPatternImage UIImage imageNamed sfond appz png 我的问题是背面图像不
  • 从技术上讲,是否可以通过编程方式截取网站的屏幕截图?

    您认为以编程方式截取网站的屏幕截图在技术上可行吗 我想制作一个计划的 Python 任务来抓取网站列表并截取它们的主页屏幕截图 您认为技术上可行吗 或者您是否知道提供此类服务的第三方网站 Input url gt Output screen
  • “借用的数据不能存储在其封闭之外”是什么意思?

    编译以下代码时 fn main let mut fields Vec new let pusher mut a str fields push a 编译器给我以下错误 error borrowed data cannot be stored
  • python-docx:将表解析为 Pandas Dataframe

    我正在使用python docx用于提取 MS Word 文档的库 我可以使用同一个库从Word文档中获取所有表格 但是 我想将表解析为 panda 数据框架 是否有任何内置功能可以用来将表解析为数据框架 或者我必须手动执行此操作 另外 是
  • 如何处理同构呈现形式的早期输入

    我有一个 React 应用程序 其中包含一个表单 该表单在服务器端呈现 并预先填充了用户正在进行的工作 问题是 如果用户在应用程序加载之前编辑表单中的值 则应用程序不会意识到更改 当用户保存时 服务器呈现的未更改的数据将被重新保存 并且用户
  • EventSource:总是出现错误

    首先EventSourceAPI 我写了最学术的例子 问题是我总是遇到错误 而且找不到任何有用的信息 当我加载时home html JS脚本停止于source onerror 我将其打印到控制台 但分析对象时我找不到任何错误类型或消息 所以
  • Laravel:vue 组件未渲染

    尽管遵循了以下教程 但我的 vue 组件并未在页面上呈现 我有以下布局 master blade php
  • 如何导航到父活动

    好吧 当我在做某事并且我需要在我的应用程序中配置操作栏时 我从http developer android com我找到了我要找的东西 public boolean onOptionsItemSelected MenuItem item s
  • geom_bar 的 gganimate 问题?

    自从 David Robinson 发布了他的 gganimate 包以来 我一直怀着羡慕和钦佩的心情看着 Twitter 上出现的各种 ggplot 动画 并认为我自己也可以玩一玩 我在使用 geom bar 时遇到 gganimate
  • firefox @font-face 因 fontawesome 失败

    我在运行的 OSS 应用程序上使用 FontAwesome 字体 但我似乎无法通过 Firefox 的字体清理程序 这些文件都在同一个域中提供 路径是正确的 我使用的是 FontAwesome 的官方 css 当通过其网站和本地文档提供时
  • 判断对象的类型? [复制]

    这个问题在这里已经有答案了 有没有一种简单的方法来确定变量是列表 字典还是其他变量 有两个内置函数可以帮助您识别对象的类型 您可以使用type 如果您需要对象的确切类型 并且isinstance to check对象的类型针对某物 通常 您
  • C# 中的 IRC 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想在我的程序中嵌入一个小聊天窗口 用作基本的 IRC 客户端 这需要有限的功能 例如连接 断开连接 列出用户和发送私人消息 在撰写本文时 我已经尝试了几个臃肿的库 这些库使得创建一
  • 字典方法 Remove 和 Clear (.NET Core) 在枚举期间修改集合。没有抛出异常

    我正在尝试实现一个缓存机制安全地枚举集合 并且我正在检查内置集合的所有修改是否都会触发InvalidOperationException由各自的枚举器抛出 我注意到在 NET Core 平台中Dictionary Remove and Di