定义析构函数与否之间是否存在差异?

时间:2014-10-21 10:39:55

标签: c#

如果我定义了~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");
    }
}

3 个答案:

答案 0 :(得分:5)

C#是一种垃圾收集语言。这意味着.NET框架(其中使用C#编写的代码)具有内存管理机制。我们不喜欢在C ++中关心被创建对象的破坏,以便我们不会有很高的内存占用或内存泄漏。这是垃圾收集器的工作。

正如在MSDN

中更正式地陈述的那样
  

通常,C#不需要所需的内存管理   当您使用不以运行时为目标的语言进行开发时   垃圾收集。这是因为.NET Framework垃圾   collector隐式管理内存的分配和释放   你的对象。但是,当您的应用程序封装非托管时   您应该使用Windows,文件和网络连接等资源   使用析构函数来释放这些资源。当对象符合条件时   对于销毁,垃圾收集器运行的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方法被称为递归 所有   继承链中的实例,从最大派生到   至少衍生的。

无论如何,你应该记住以下几点:

  

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

答案 1 :(得分:0)

如果析构函数实际上有一些正在执行的代码,那么当然这将是一个区别,但是你不能保证它被调用的时间等等。 另外,你问一个关于asp.net的问题,但你从控制台应用程序发布了代码吗?

答案 2 :(得分:0)

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

无需编写任何显式代码/功能来实现此目的。

有关详细信息,请参阅this