現在,foreach 語句可以動態地檢查它所迭代的數據結構中是否存在 IDisposable 接口。以前,編譯器從不動態地檢查 Idisposable 接口是否存在,除非從 GetEnumerator 返回的類型已實現了 IEnumerator 接口。然而,如果此類型對于實現 Idisposable 是靜態已知的,則編譯器將一直調用 Dispose。換句話說,如果迭代程序類型實現了枚舉器設計模式,但沒有專門實現 IEnumerator 接口,編譯器就不會調用 Dispose 方法,除非 iterator 類型對于實現 IDisposable 接口是靜態已知的。
現在,編譯器在檢測是否存在 IDisposable 接口時,無論迭代程序類型是否實現 IEnumerator,都將調用 Dispose 方法(如果已實現)。在下面的示例中,Visual C# .NET 2002 編譯器未調用 Dispose 方法,但 Visual C# .NET 2003 編譯器調用了該方法:
abstract class Base
{
public int Current { get; }
public bool MoveNext();
}
class Derived: Base, IDisposable
{
// Base 和 IDisposable 的實現
}
class MyClass
{
public Base GetEnumerator()
{
return new Derived();
文章來源于領測軟件測試網 http://www.kjueaiud.com/