类中的析构函数和 Finalize 方法之间有什么区别(如果有)?

我最近发现 Visual Studio 2008 认为析构函数与 Finalize 方法同义,这意味着 Visual Studio 不允许您在类中同时定义这两种方法。

例如下面的代码片段:

class TestFinalize
{
    ~TestFinalize()
    {
        Finalize();
    }

    public bool Finalize()
    {
        return true;
    }
}

在析构函数中调用 Finalize 时出现以下错误:

以下方法或属性之间的调用是不明确的:'TestFinalize.~TestFinalize()' 和 'TestFinalize.Finalize()'

如果对 Finalize 的调用被注释掉,则会出现以下错误:

键入'ManagementConcepts.service.testfinalize'已经定义了一个名为“最终化”的成员使用相同的参数类型

有帮助吗?

解决方案

在C#重写析构函数System.Object.Finalize方法。您必须使用析构函数语法来做到这一点。手动覆盖Finalize会给你一个错误消息。

基本上你试图用你的Finalize方法声明做的是的 <强>隐藏 基类的方法。这将导致编译器发出这可以使用new修改(如果是去上班)沉默的警告。这里要注意的重要一点是,您不能override并宣布在同一时间以相同名称的new构件,从而既具有析构函数和Finalize方法会导致错误(但你的可以下,尽管不推荐,声明一个public new void Finalize()方法,如果你不声明一个析构函数)。

其他提示

维基百科对一个终结和之间的差一些很好的讨论在终结一文。

C#真的没有“真正”的析构函数。语法类似于C ++的析构函数,但它确实是一个终结。

:你在你的榜样的第一部分正确地写
~ClassName() { }

以上为Finalize功能语法糖。它确保在底座上的终结保证运行,但在其它方面与重写Finalize功能。这意味着,当你写的析构函数的语法,你真的写的终结。

根据微软时,终结器是指功能,该垃圾收集器调用时,它收集(Finalize),而析构函数是你的执行结果的代码位(即成为Finalize的语法糖)。他们是如此接近是相同的事情,微软应该从来没有的区别。

微软的使用C ++的‘析构’一词是误导性的,因为在C ++中,它是在相同的线程上一旦对象被删除执行或弹出栈,而在C#它是在一个单独的线程在另一个执行时间。

在这里找到:http://sanjaysainitech.blogspot.com/2007/06/difference- Between-destructor-dispose.html

  1. 析构函数

    它们是包含对象清理代码的特殊方法。您无法在代码中明确称它们为GC隐式称为它们。在C#中,他们的名称与班级名称相同。 ~ 符号。喜欢-

    Class MyClass
    {
    
    ~MyClass()
    {
    .....
    }
    }
    

    在VB.NET中,通过覆盖系统的最终化方法来实现攻击子。

  2. 处置

    这些就像班级中的任何其他方法一样,可以明确称为,但它们具有清理对象的特殊目的。在 dispose 方法中,我们为对象编写清理代码。重要的是,我们释放了诸如数据库连接,文件等的处置方法中的所有不受管理的补偿。实施处置方法的类应实现可iDisposable接口。一个处置方法应调用GC.Suppressfressfressfressfressfinalize方法,用于如果类具有DESTURCTOR,因为它已经完成了工作以清理对象,则该方法处置的对象,那么它是没有必要的垃圾收集器调用对象的最终确定方法。参考: http://msdn2.microsoft.com/en-us/library/aa720161(VS.71).aspx

  3. 最终确定

    如果未调用您的处置方法,则最终方法可以作为清理资源的保障。您只能实施最终确定方法来清理非托管资源。您不应该为托管对象实现最终确定方法,因为垃圾收集器会自动清理托管资源。最终化方法由GC隐含地调用,因此您无法从代码中调用它。

    笔记: 在C#中,最终确定方法不能被覆盖,因此您必须使用destructor的内部实现将覆盖MSIL中的最终方法。但是在VB.NET中,最终化方法可以被覆盖,因为它确实支持Destructors方法。

更新: 这里有有趣的半相关线程.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top