在使用 LINQ 时,通常会使用 foreach 循环来遍历集合或数组。对于实现 IEnumerator<T> 接口的类,其 Dispose() 方法会在 foreach 循环结束时自动调用。以下是一个示例代码:
class MyList<T> : IEnumerable<T>
{
private List<T> items = new List<T>();
public void Add(T item)
{
items.Add(item);
}
public IEnumerator<T> GetEnumerator()
{
return new MyListEnumerator<T>(items);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
private class MyListEnumerator<T> : IEnumerator<T>
{
private List<T> items;
private int currentIndex;
public MyListEnumerator(List<T> items)
{
this.items = items;
currentIndex = -1;
}
public void Dispose()
{
Console.WriteLine("Dispose() called.");
}
public bool MoveNext()
{
currentIndex++;
return currentIndex < items.Count;
}
public void Reset()
{
currentIndex = -1;
}
public T Current
{
get { return items[currentIndex]; }
}
object IEnumerator.Current
{
get { return Current; }
}
}
}
class Program
{
static void Main(string[] args)
{
MyList<int> list = new MyList<int>();
list.Add(1);
list.Add(2);
list.Add(3);
foreach (int i in list)
{
Console.WriteLine(i);
}
}
}
当 foreach 循环结束时,MyListEnumerator<T>.Dispose() 方法会被自动调用,并输出 "Dispose() called."。