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 实现也会运行,并且在对象被垃圾回收时资源仍然会被释放。
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP