2011-02-13 18 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

希望這有助於澄清! ;)

相關問題