在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();
}
答案 0 :(得分:49)
是的,如果它实现了IDisposable,foreach将在枚举器上调用Dispose()。
答案 1 :(得分:12)
这个问题/答案措辞不力。
目前尚不清楚提出的问题是:
问:" foreach会在移动到下一个之前处理枚举器返回的对象吗?"
答:答:当然,答案是否定的。除了提供一种为枚举中的每个对象运行一次代码的便捷方法之外,它什么都不做。或者是否意味着:
问:"在引擎盖下,foreach使用了一个可枚举的对象。在调用foreach之后,这是否会被处理掉,即使迭代器块中有异常?"
答:答案是(仍然很明显)是的!由于语法不允许您访问枚举器,因此它有责任对其进行处理。第二个问题的答案是出现混乱的地方,因为人们已经听说foreach通过try / finally块扩展到了一段时间。最终的目的是确保枚举器在实现IDisposable时被处置。
如果您需要自己查看:See it in action here
希望这有助于澄清! ;)