1 析构函数只能由运行时(CLR)中的垃圾回收器(GC)调用来进行资源回收,Despose方法只能由类的使用者调用
在C#中,凡是继承了IDisposable接口的类,都可以使用using语句,从而在超出作用域后,让系统自动调用Dispose()方法。
一个资源安全的类,都实现了IDisposable接口和析构函数。提供手动释放资源和系统自动释放资源的双保险。
示例:
测试类
using System; namespace ConsoleApp1 { public class FinalizeTest : IDisposable { // 析构函数,由gc调用 ~FinalizeTest() { Console.WriteLine("GC调用"); Console.ReadKey(); } // 实现IDisposable接口的Dispose方法 public void Dispose() { Console.WriteLine("using块结束回收资源"); } } }
测试方法:
static void Main(string[] args) { using(FinalizeTest t=new FinalizeTest()) { } }
调试过程如下:
参考链接:https://blog.csdn.net/zlwzlwzlw/article/details/7918633
2 GC.SuppressFinalize
GC.SuppressFinalize(this) 作用:请求公共语言运行时不要调用该对象上的终结器(在C#中就是指gc不要调用析构函数),如果已经手动释放了资源可以使用该语句来请求gc不用再回收该资源了。
改造Dispose方法如下
// 实现IDisposable接口的Dispose方法 public void Dispose() { Console.WriteLine("using块结束回收资源"); GC.SuppressFinalize(this); // 请求公共语言运行时不要调用该对象上的终结器(在C#中就是指不要调用析构函数) }
这时析构函数就不会被gc线程调用了;
参考链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.object.finalize?view=net-5.0