首页 > Windows开发 > 详细

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

时间:2020-12-25 22:50:38      阅读:46      评论:0      收藏:0      [点我收藏+]

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

 

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

原文:https://www.cnblogs.com/tomorrow0/p/14190887.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!