我什麼時候應該使用 IDisposable,使用它會不會出錯?處置鏈呢?
我真的在尋找一些最佳實踐智慧。所以這裡是問題,如果人們發表評論,我會添加更多。請隨意回答部分或全部這些問題。
我什麼時候應該使用 IDisposable?只有當我有非託管資源時?
處置模式有哪些變化,為什麼它們會變化?
我應該注意哪些常見的非託管資源?
實施 IDisposable 是否有錯誤或誤導性?
是否應該將 Dispose 呼叫連結在一起,或者我們應該依賴 using 語句? 例如:
public Dispose(bool disposing) { ... this.SomeDependency.Dispose; }
哇。這裡有很多問題!
我什麼時候應該使用 IDisposable?只有當我有非託管資源時?
IDisposable通常用於清理資源,但這並不一定是它的全部好處*。*通知正在使用的對象您已完成使用它是一種通用模式。一個例子是計時器:using(var timer = new MyTimer()) { //do some stuff }在這種情況下,呼叫
Dispose並不一定會釋放任何資源,它只是一種方便且一致的方式(一個模式的兩個鍵!)告訴計時器“好的,我現在已經完成了”並且計時器可以停止計時,也許在某處記錄時間。另一個好的經驗法則是,如果您需要終結器,無論出於何種原因,您通常還應該提供
IDisposable對相同常式的訪問,以便消費類可以選擇更早地終結該類,而不是等待 GC。處置模式有哪些變化,為什麼它們會變化?
IDisposable我知道只有一種真正的“特定”實現類型——Finalize/Dispose 模式:public class MyClass : IDisposable { void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { // Free other state (managed objects). } // Free your own state (unmanaged objects). // Set large fields to null. } ~MyClass() { Dispose(false); } }我應該注意哪些常見的非託管資源?
任何實現.NET 庫的東西
IDisposable,尤其是在 .NET 庫中,都應該被假定為具有非託管資源的句柄並且應該被釋放。通常,您只能通過這些訪問非託管資源。如果沒有,你會知道的——通常是建構一個驅動程序或其他東西。實施 IDisposable 是否有錯誤或誤導性?
過度使用它可能毫無意義,但不會直接有害。
是否應該將 Dispose 呼叫連結在一起
一個類應該只處理它在內部創建的任何 IDisposables。如果它具有註入或存在於類範圍之外的一次性依賴項,則永遠不應該釋放它們。