Meh*_*dad 34 .net c# ienumerator
如何正确地打电话IEnumerator.Reset?
文件说:
该
Reset方法用于COM互操作性.它不一定需要实施; 相反,实施者可以简单地抛出一个NotSupportedException.
好的,这也就是说我不应该打电话给它吗?
它是如此诱人的使用流量控制例外:
using (enumerator = GetSomeExpensiveEnumerator())
{
while (enumerator.MoveNext()) { ... }
try { enumerator.Reset(); } //Try an inexpensive method
catch (NotSupportedException)
{ enumerator = GetSomeExpensiveEnumerator(); } //Fine, get another one
while (enumerator.MoveNext()) { ... }
}
Run Code Online (Sandbox Code Playgroud)
这是我们应该如何使用它?或者我们不打算从托管代码中使用它?
Mar*_*ell 50
从未 ; 最终这是一个错误.不止一次迭代序列的正确方法是.GetEnumerator()再次调用- 即foreach再次使用.如果您的数据不可重复(或重复费用昂贵),请通过.ToList()或类似地缓冲它.
迭代器块为此方法抛出异常是语言规范中的正式要求.因此,你不能依赖它的工作.永远.
我建议不要使用它.许多现代IEnumerable实现只会抛出异常.
获得调查员几乎不"昂贵".它全部(完全)枚举它们可能很昂贵.