我正在尝试实现一个缓存机制安全地枚举集合,并且我正在检查内置集合的所有修改是否都会触发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(使用前将#替换为@)