定义析构函数与否有区别吗

本文关键字:有区别 析构函数 定义 | 更新日期: 2023-09-27 18:27:14

如果我定义了~Example部分,那么垃圾收集中有区别吗?

class Example
{
    public void Display()
    {
         Console.WriteLine("hi");
    }
    ~Example()//**does giving this part or not has any effects in garbage collection**
    {
    }
}

class Example
{
    public void Display()
    {
         Console.WriteLine("hi");
    }
}

定义析构函数与否有区别吗

C#是一种垃圾回收语言。这意味着执行用C#编写的代码的.NET框架具有内存管理机制。我们不像C++那样关心创建的对象的破坏,这样我们就不会有高内存占用或内存泄漏。这就是垃圾回收员的工作。

正如MSDN 中更正式地指出的那样

一般来说,C#不需要所需的那么多内存管理当您使用不以运行时为目标的语言进行开发时垃圾收集。这是因为.NET Framework垃圾收集器隐式管理的内存分配和释放您的物品。但是,当应用程序封装非托管时诸如窗口、文件和网络连接之类的资源,您应该使用析构函数释放这些资源。对象符合条件时对于销毁,垃圾收集器运行的Finalize方法对象

然而,析构函数的概念也存在于C#中,就像在其他语言中一样,它用于类实例的销毁。此外,不能调用析构函数。它是自动调用的。

例如,如果我们声明以下类:

class Customer
{
    ~Customer()
    {
        // Here we place our clean up statements.
    }
}

析构函数将在对象的基类上隐式调用Finalize方法。正如上面链接中所解释的,C#编译器会将此代码翻译为以下代码:

protected override void Finalize()
{
    try
    {
        // Here goes our clean up statements.
    }
    finally
    {
        base.Finalize();
    }
}

这意味着Finalize方法被递归地调用用于所有继承链中的实例,从派生最多的实例到推导最少。

在任何情况下,你都应该记住以下几点:

程序员不能控制何时调用析构函数因为这是由垃圾收集器决定的。垃圾收集器检查不再由应用如果它认为一个物体有资格销毁调用析构函数(如果有的话)并回收用于存储的内存对象。程序退出时还会调用析构函数。

如果析构函数中确实有一些正在执行的代码,那么当然会有所不同,但是你不能保证调用它的时间等等。另外,你问了一个关于asp.net的问题,但你发布了来自控制台应用程序的代码?

C#内置了释放未使用对象或无效对象的机制。它定期运行并清理内存。

不需要编写任何明确的代码/功能来实现这一点。

有关更多详细信息,请参阅此