集合使用yield return语句更改安全性

时间:2013-12-03 19:51:36

标签: c# .net yield-return

使用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(_listInternal中的字符串s)当然会在这种情况下捕获这个,但是如果我不使用集合或列表作为源代码,是否会出现问题?

如果我更改了创建枚举器的集合,它通常会使用此_version字段来保护自己不被更改,而迭代器会通过项目进行迭代。当多个线程处理它时,这也是一个问题。

2 个答案:

答案 0 :(得分:2)

没有必要,假设_listInternal实际上是List<T>List枚举器已实现此功能;如果你在迭代它时改变它的集合,它的枚举器将抛出异常,并且该异常将通过你的迭代器块传播。

如果您的迭代器块基于尚未具有此行为的基础集合,或者除了您使用的某个基础集合之外还存在可变状态,但这不能更改,那么您可能希望使用此模式,是

当然,为了能够实现此模式,您需要在更改基础数据时使用某种方法来增加版本号。有时候,如果你使用的是一个集合,你无法控制代码,你就是不能这样做。

答案 1 :(得分:0)

不,您永远不需要使用版本来获得收益率,它们应被视为原子。