有一个如何实现枚举器可能的例子:
http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx这是一种有效的方法。然而,真正的 List
或 Array
在修改时会使它们的迭代器失效。
我的问题是——它是如何完成的?
我能想到的最好的是仍然保留对集合的引用,以及一些戳记(int id)。每次调整集合大小时,邮票都会递增。在枚举器端的每个 moveNext
上,都会检查标记——如果匹配,则枚举继续,如果不匹配——则抛出异常。
但这只是我的胡乱猜测,我没有找到任何可靠的东西。
最佳答案
how is it done?
微不足道。保留一个版本计数器。将创建枚举器时的版本计数器与每次产生时枚举对象中当前的版本计数器进行比较。完成的。显然:每次更改都要更改版本。
现在,“我没有找到任何可靠的东西”——你有没有想过——啊——阅读源代码?这都是公开的,你知道的......
http://referencesource.microsoft.com/
你寻找 mscorlib。
例如,ArrayList:http://referencesource.microsoft.com/#mscorlib/system/collections/arraylist.cs
没有比这更坚固的了。
关于c# - 收集的真实枚举器是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23594086/