在C#中,类中的析构函数和Finalize方法有什么区别?

在C#中,类中的析构函数和Finalize方法有什么区别?,c#,destructor,finalize,C#,Destructor,Finalize,类中的析构函数和Finalize方法之间有什么区别(如果有的话) 我最近发现VisualStudio2008将析构函数视为Finalize方法的同义词,这意味着VisualStudio不允许在一个类中同时定义这两个方法 例如,以下代码片段: class TestFinalize { ~TestFinalize() { Finalize(); } public bool Finalize() { return true;

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

我最近发现VisualStudio2008将析构函数视为Finalize方法的同义词,这意味着VisualStudio不允许在一个类中同时定义这两个方法

例如,以下代码片段:

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

    public bool Finalize()
    {
        return true;
    }
}
在析构函数中调用Finalize时出现以下错误:

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

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

类型“ManagementConcepts.Service.TestFinalize”已定义名为 使用相同的参数类型“Finalize”

  • 析构函数

    它们是包含对象清理代码的特殊方法。 在调用它们时,不能在代码中显式调用它们 由GC隐式地执行。在C#中,它们与前面的类名同名 通过
    ~
    符号。像-

    Class MyClass
    {
    
    ~MyClass()
    {
    .....
    }
    }
    
    在VB.NET中,析构函数是通过重写Finalize来实现的 对象类的方法

  • 处置

    这些方法与类中的任何其他方法一样,可以调用 但它们有清理对象的特殊目的。 在dispose方法中,我们为对象编写清理代码。它是 重要的是,我们释放了dispose中的所有非托管资源 类实现的数据库连接、文件等方法 dispose方法应实现IDisposable接口。dispose方法 应该为它所在的对象调用GC.SuppressFinalize方法 如果类已取消采购,因为它已完成 清理工作对象,则无需进行垃圾清理 收集器调用对象的Finalize方法。参考:

  • 定稿

    Finalize方法充当清理数据库中资源的保护措施 未调用Dispose方法的事件。你只应该 实现Finalize方法以清理非托管资源。你 不应为托管对象实现Finalize方法,因为 垃圾收集器自动清理托管资源。 Finalize方法由GC隐式调用,因此您不能 从代码中调用它

    注意:在C#中,Finalize方法不能重写,因此您必须 使用析构函数,其内部实现将覆盖 在MSIL中Finalize方法。但是在VB.NET中,Finalize方法可以是 重写,因为它不支持析构函数方法

  • 更新:

    C#中的析构函数覆盖
    系统.Object.Finalize
    方法。您必须使用析构函数语法来执行此操作。手动覆盖
    Finalize
    将显示一条错误消息


    基本上,您试图用
    Finalize
    方法声明执行的是基类的方法。它将导致编译器发出警告,可以使用
    new
    修饰符使警告静音(如果它要工作的话)。这里需要注意的重要一点是,不能同时覆盖和声明具有相同名称的
    新成员,因此同时使用析构函数和
    Finalize
    方法将导致错误(但是如果您没有声明析构函数,您可以声明一个
    public new void Finalize()
    方法,尽管不推荐这样做)。

    Wikipedia在文章中对finalizer和a之间的区别进行了一些很好的讨论

    C实际上没有一个“真”析构函数。语法类似C++析构函数,但它确实是一个终结器。在例子的第一部分中,你正确地写了:

    ~ClassName() { }
    
    上面是
    Finalize
    函数的语法糖。它确保了基中的终结器保证运行,但在其他方面与重写
    Finalize
    函数相同。这意味着在编写析构函数语法时,实际上是在编写终结器

    ,finalizer是指垃圾收集器在收集时调用的函数(
    Finalize
    ),而析构函数是作为结果执行的代码位(成为
    Finalize
    )的语法糖。它们非常接近于同一个东西,Microsoft不应该做出区分


    微软使用C++的“析构函数”术语是误导性的,因为在C++中,对象被删除或从堆栈中弹出时,它就在同一线程上执行,而在C语言中,它在另一个时间上在单独的线程上执行。

    <代码>,您只应执行一个终结方法来清理非托管资源:您把它放入最后一个。ne应该实现
    Dispose
    的数量远远超过应该实现终结器的数量。如果类或派生类的实例很可能是直接拥有非托管资源的最后一个对象,或者直接拥有直接拥有非托管资源的最后一个对象,或者直接拥有非托管资源的最后一个对象,则应实现
    Dispose
    仅当一个类直接拥有一个非托管资源而几乎没有其他东西时,才为资源清理实现
    Finalize
    ,这是一个更狭隘的场景。@hqt:如果一个类直接拥有非托管资源,并且还持有对其他对象的引用,则非托管资源通常应该e拆分为自己的可终结类(理想情况下,该类不应持有对其他对象的任何强引用),这意味着持有对其他对象的引用的类将只拥有“直接拥有非托管资源的对象”,而不是拥有