如何正确地打电话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)
这是我们应该如何使用它?或者我们不打算从托管代码中使用它?
遵循两种方法(一种使用IEnumerator<int>和其他用途List<int>.Enumerator)即使外观相同也会产生不同的结果.
static void M1()
{
var list = new List<int>() { 1, 2, 3, 4 };
IEnumerator<int> iterator = list.GetEnumerator();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
iterator.Reset();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
}
static void M2()
{
var list = new List<int>() { 1, 2, 3, 4 };
//Here the iterator will be List<int>.Enumerator (which is a struct)
var iterator = list.GetEnumerator();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
//This will not work, as Reset method was implemented explicitly …Run Code Online (Sandbox Code Playgroud)