C# 中的 Finalize 和 Dispose 有什么区别?

csharpserver side programmingprogramming更新于 2025/10/2 10:22:17

Finalize

Finalize() 会在符合回收条件的对象被回收之前由垃圾收集器调用。垃圾收集器将负责释放未引用对象的内存。垃圾收集器会在内存中不再有对该对象的有效引用后调用此方法。

框架不保证何时会发生这种情况,我们可以强制进行垃圾收集,但这会影响程序性能。Finalize() 属于 Object 类,它将由运行时调用。

示例

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

Dispose

有些资源(例如 Windows 句柄、数据库连接、网络连接、文件等)无法被垃圾收集器回收。如果我们想要显式释放某些特定对象,最好实现 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){
               //清理托管对象
            }
            //清理非托管对象
            disposal = true;
         }
      }
}

Microsoft 建议我们在处理非托管资源时同时实现 Dispose 和 Finalize 方法。即使开发人员忽略了显式调用 Dispose 方法,Finalize 方法也会运行,并且在对象被垃圾回收时,资源仍会被释放。


相关文章