使用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字段来保护自己不被更改,而迭代器会通过项目进行迭代。当多个线程处理它时,这也是一个问题。
答案 0 :(得分:2)
没有必要,假设_listInternal
实际上是List<T>
。 List
枚举器已实现此功能;如果你在迭代它时改变它的集合,它的枚举器将抛出异常,并且该异常将通过你的迭代器块传播。
如果您的迭代器块基于尚未具有此行为的基础集合,或者除了您使用的某个基础集合之外还存在可变状态,但这不能更改,那么您可能希望使用此模式,是
当然,为了能够实现此模式,您需要在更改基础数据时使用某种方法来增加版本号。有时候,如果你使用的是一个集合,你无法控制代码,你就是不能这样做。
答案 1 :(得分:0)
不,您永远不需要使用版本来获得收益率,它们应被视为原子。