C# IDisposable与析构函数与GC.SuppressFinalize

1 析构函数只能由运行时(CLR)中的垃圾回收器(GC)调用来进行资源回收,Dispose方法只能由类的使用者调用

在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

 

posted @ 2020-12-25 21:48  温故纳新  阅读(875)  评论(0编辑  收藏  举报