析构函数

本文详细介绍了C#中的析构函数概念、作用、规则及使用注意事项,并通过实例展示了如何在析构函数中进行资源清理。此外,文章还强调了在析构函数中调用Dispose方法的重要性,以及如何通过IDisposable接口实现资源的显式释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来岛国已经45天了,感觉一切都没有想象的那么好,看来还是得多努力了,从头开始吧!今天废话不多说了,开始学习:

今天学习下析构函数吧,

析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

备注:

1、不能在结构中定义析构函数。 只能对类使用析构函数;

2、一个类只能有一个析构函数。

3、无法继承或重载析构函数

4、无法调用析构函数。 它们是被自动调用的。

5、析构函数既没有修饰符,也没有参数。

下面就来学学msdn上的列子吧;

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

该析构函数隐式地对对象的基类调用 Finalize。 这样,前面的析构函数代码被隐式地转换为以下代码:


protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}
这意味着对继承链中的所有实例递归地调用 Finalize 方法(从派生程度最大的到派生程度最小的)。

不应使用空析构函数。 如果类包含析构函数,Finalize 队列中则会创建一个项。 调用析构函数时,将调用垃圾回收器来处理该队列。 如果析构函数为空,只会导致不必要的性能损失。

可以通过调用 Collect 强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。

通常,与运行时不进行垃圾回收的开发语言相比,C# 无需太多的内存管理。 这是因为 .NET Framework 垃圾回收器会隐式地管理对象的内存分配和释放。 但是,当应用程序封装窗口、文件和网络连接这类非托管资源时,应当使用析构函数释放这些资源。 当对象符合析构时,垃圾回收器将运行对象的 Finalize 方法。


资源的显式释放:

定义一种释放分配的资源的方法, 如果您的应用程序在使用昂贵的外部资源,我们还建议您提供一种在垃圾回收器释放对象前显式地释放资源的方式。 可通过实现来自 IDisposable (定义一种释放分配的资源的方法)接口的 Dispose(执行与释放或重置非托管资源相关的应用程序定义的任务。) 方法来完成这一点,该方法为对象执行必要的清理。 这样可大大提高应用程序的性能。 即使有这种对资源的显式控制,析构函数也是一种保护措施,可用来在对 Dispose 方法的调用失败时清理资源。

    class Demo : IDisposable
    {
        //指向外部的非托管资源
        private IntPtr handle;
        //其他管理资源类使用
        private Component component = new Component();
        //跟踪是否已调用了Dispose。
        private bool disposed = false;

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
            Console.WriteLine("Dipose");
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    //处置托管资源。
                    component.Dispose();
                }
                CloseHandle(handle);
                handle = IntPtr.Zero;
                disposed = true;
            }
            Console.WriteLine("Dipose(bool)");
        }

        [System.Runtime.InteropServices.DllImport("Kernel32")]
        private extern static Boolean CloseHandle(IntPtr handle);

        ~Demo()
        {
            Dispose(false);

            Console.WriteLine("~Demo");
        }

        public Demo(IntPtr handle)
        {
            this.handle = handle;
            Console.WriteLine("Demo(IntPtr handle)");
        }

        public static void Main()
        {
            Console.WriteLine("Process Start~");
        }

    }



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值