IDisposable介面是資源清理的核心,在 C# 中有兩個重要的角色:
Dispose()方法),好讓類別能釋放任何非受控資源,或視情況重設其內部狀態。這與一般的清理方式形成對比:一般做法是讓垃圾回收器清理一切(主要是釋放記憶體)。IDisposable介面會與編譯器和執行階段搭配運作,支援在 resource-lifetime練習中討論過的 using敘述。在某些通用的清理常式中,Dispose()確實有可能透過介面被呼叫,只是這種情況並不常見。
IDisposable最常出現在包裝作業系統(非受控)資源的程式庫類別中,例如 System.IO.Stream 和 System.IO.TextReader。(Stream和TextReader會在其他練習中介紹。)
public class TextHandler : IDispoable
{
private TextReader reader = new TextReader(...);
public void Dispose()
{
reader.Dispose();
}
}
如果你使用的類別有實作 IDispoable介面,就必須確保在執行個體不再需要時會呼叫 Dispose()(做法是使用 catch 和 finally 子句)。如果某個類別有實作 IDisposable 的成員,那麼這個類別本身很可能也需要實作 IDisposable,這樣才能呼叫 Dispose() 來處置實作 IDisposble 的成員。
public class Activity : IDisposable
{
private MyResource myResource;
public Activity()
{
myResource = new MyResource();
}
public void Perform()
{
try
{
myResource.BeUseful();
}
catch (Exception)
{
myResource.Dispose();
}
}
public void Dispose()
{
myResource.Dispose();
}
}
即使完全沒有牽涉到非受控資源,IDisposable介面也可能很有用。假設你有一個生命週期很長的物件,它要求生命週期短的物件向它註冊,並在不再需要時取消註冊。在短生命週期的物件上實作 IDisposable,可以讓使用該類別的開發者留意到,必須在這個物件生命結束時呼叫 Dispose()。
你會在文件中看到處置模式的相關說明。處置模式 涵蓋從類別的完成項呼叫 Dispose(),並確保基底類別中的資源處置能正確處理。處置模式 會在後面的練習中介紹。
處置模式 大多與非受控資源有關。如果你使用 P/Invoke 機制和 extern 方法,就需要了解如何及何時實作處置模式。大多數 C# 開發者很少需要這樣直接處理非受控資源。