C# 中 Finalize 和 Dispose 的區別是什麼?


Finalize

Finalize() 方法由垃圾回收器在回收可被回收的物件之前呼叫。垃圾回收器將負責為未引用的物件釋放記憶體。垃圾回收器在記憶體中不再存在對該物件的有效引用後,會在某個時間點呼叫此方法。

框架不保證何時會發生這種情況,我們可以強制進行垃圾回收,但這會損害程式的效能。Finalize() 屬於 Object 類,它將由執行時呼叫。

示例

using System;
namespace DemoApplication{
   public class Demo{
      ~Demo(){
         Console.WriteLine("Finalize called");
      }
   }
}

Dispose

有一些資源(如 Windows 控制代碼、資料庫連線、網路連線、檔案等)無法由垃圾回收器回收。如果我們想要顯式釋放一些特定的物件,那麼實現 IDisposable 並重寫 IDisposable 介面的 Dispose() 方法是最佳實踐。

Dispose() 方法不會自動呼叫,我們必須在客戶端應用程式中顯式呼叫它,當不再需要某個物件時。即使其他對該物件的引用仍然存在,也可以呼叫 Dispose()。

示例

using System;
namespace DemoApplication{
   public class Demo : IDisposable{
      private bool disposed = false;
      public void Dispose(){
         Dispose(true);
         GC.SuppressFinalize(this);
      }
      protected virtual void Dispose(bool disposing){
         if (!disposed){
            if (disposing){
               //clean up managed objects
            }
            //clean up unmanaged objects
            disposed = true;
         }
      }
   }
}

Microsoft 建議我們在處理非託管資源時同時實現 Dispose 和 Finalize。即使開發人員忽略了顯式呼叫 Dispose 方法,Finalize 實現也會執行,並且在物件被垃圾回收時資源仍然會被釋放。

更新於: 2020年8月4日

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.