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+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告