2011-02-13 60 views
48

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

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

*否则,collection表达式是实现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(); 
} 

回答

41

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

+0

你的意思是在_enumerable_上还是在_enumerator_上? – zneak 2011-02-13 04:22:18

+1

@zneak:这是统计员。枚举只是提供了一种检索枚举器的方法。 – 2011-02-13 04:23:44

10

这个问题的措辞不是很好。

目前尚不清楚,如果问的问题是:

问:“有没有的foreach移动到下一个处理之前由枚举返回的对象”

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

还是它的意思是:

问:“引擎盖下的foreach使用一个枚举对象这是否得到安置后调用的foreach,即使有迭代器块中的例外呢?”

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

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

如果你需要看到它自己:See it in action here

希望这有助于澄清! ;)

相关问题