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 实现也会运行,并且在对象被垃圾回收时资源仍然会被释放。
广告