foreach会自动调用Dispose吗?

时间:2011-02-13 04:15:48

标签: c# foreach idisposable

在C#中,foreach是否会在任何实现IDisposable的对象上自动调用Dispose?

http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx似乎表明它确实:

*否则,集合表达式是一个实现System.IEnumerable的类型,而foreach语句的扩展是: 复制

IEnumerator enumerator = 
        ((System.Collections.IEnumerable)(collection)).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      ElementType element = (ElementType)enumerator.Current;
      statement;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}

2 个答案:

答案 0 :(得分:49)

是的,如果它实现了IDisposable,foreach将在枚举器上调用Dispose()。

答案 1 :(得分:12)

这个问题/答案措辞不力。

目前尚不清楚提出的问题是:

问:" foreach会在移动到下一个之前处理枚举器返回的对象吗?"

答:答:当然,答案是否定的。除了提供一种为枚举中的每个对象运行一次代码的便捷方法之外,它什么都不做。

或者是否意味着:

问:"在引擎盖下,foreach使用了一个可枚举的对象。在调用foreach之后,这是否会被处理掉,即使迭代器块中有异常?"

答:答案是(仍然很明显)是的!由于语法不允许您访问枚举器,因此它有责任对其进行处理。

第二个问题的答案是出现混乱的地方,因为人们已经听说foreach通过try / finally块扩展到了一段时间。最终的目的是确保枚举器在实现IDisposable时被处置。

如果您需要自己查看:See it in action here

希望这有助于澄清! ;)