是否自动调用Dispose?

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

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

*否则,集合expression式是实现System.IEnumerable的types,并且foreach语句的扩展是:Copy

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(); } 

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

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

目前尚不清楚问题是:

问:“foreach在处理下一个对象之前是否处理了枚举器返回的对象?

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

或者是否意味着:

问:“在这种情况下,foreach使用了一个枚举对象,在调用foreach之后,即使在迭代器块中有一个exception,它是否会被抛弃?

答:答案是(还算相当明显)是的! 由于语法不能让您访问枚举器,所以它有责任处理它。

第二个问题的答案是混淆的地方,因为人们已经听说foreach以try / finally块的forms扩展到了一段时间。 最终的目的是确保枚举器在实现IDisposable的情况下处理。

如果你需要亲眼看到它: 在这里看到它的行动

希望这有助于澄清! ;)