Dot-Net

我什麼時候應該使用 IDisposable,使用它會不會出錯?處置鏈呢?

  • August 1, 2010

我真的在尋找一些最佳實踐智慧。所以這裡是問題,如果人們發表評論,我會添加更多。請隨意回答部分或全部這些問題。

我什麼時候應該使用 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。如果它具有註入或存在於類範圍之外的一次性依賴項,則永遠不應該釋放它們。

引用自:https://stackoverflow.com/questions/3380027