【发布时间】:2013-12-03 19:51:36
【问题描述】:
使用 yield return 语句我总是想知道是否要实现版本计数:
private IEnumerator<string> GetStrings()
{
int initialVersion = _version; // Where _version is incremented everytime the list changes
foreach(string s in _listInternal)
{
if (initialVersion != _version)
throw ...;
yield return s;
}
}
foreach(string s in _listInternal) 当然会在这种情况下捕捉到这一点,但是如果我不使用集合或列表作为源,会有问题吗?
如果我更改创建枚举器的集合,它通常会使用此 _version 字段来保护自己在迭代器遍历项目时不被更改。当多个线程同时工作时,这也是一个问题。
【问题讨论】:
-
我不明白你的问题。能否请您详细说明一下?
-
这是一个线程安全问题吗?
-
@aj.toulan 可能,但通常不会。通常,它是一个单线程,它会改变 foreach 循环体中的底层集合,例如
foreach(var item in list) list.Remove(item);。 -
我通常在这种情况下使用它。 list.RemoveAll(x => x.ShouldDelete);其中 ShouldDelete 是您正在操作的列表类型中的 bool 属性。我相信也可以这样写 list.RemoveAll(ShouldDelete);
-
@aj.toulan 是的,这是解决特定问题而不产生此错误的一种方法;我给出了一个编写不当的代码示例,如果使用该代码应该抛出此异常,期望调用者将其代码更改为更符合您所拥有的内容。我还证明了编写不当的代码不一定是(也可能不会是)多线程的。
标签: c# .net yield-return