在 C# 中,类中的析构函数和 Finalize 方法有什么区别?
-
21-08-2019 - |
题
类中的析构函数和 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
析构函数
它们是包含对象清理代码的特殊方法。您无法在代码中明确称它们为GC隐式称为它们。在C#中,他们的名称与班级名称相同。
~
符号。喜欢-Class MyClass { ~MyClass() { ..... } }
在VB.NET中,通过覆盖系统的最终化方法来实现攻击子。
处置
这些就像班级中的任何其他方法一样,可以明确称为,但它们具有清理对象的特殊目的。在 dispose 方法中,我们为对象编写清理代码。重要的是,我们释放了诸如数据库连接,文件等的处置方法中的所有不受管理的补偿。实施处置方法的类应实现可iDisposable接口。一个处置方法应调用GC.Suppressfressfressfressfressfinalize方法,用于如果类具有DESTURCTOR,因为它已经完成了工作以清理对象,则该方法处置的对象,那么它是没有必要的垃圾收集器调用对象的最终确定方法。参考: http://msdn2.microsoft.com/en-us/library/aa720161(VS.71).aspx
最终确定
如果未调用您的处置方法,则最终方法可以作为清理资源的保障。您只能实施最终确定方法来清理非托管资源。您不应该为托管对象实现最终确定方法,因为垃圾收集器会自动清理托管资源。最终化方法由GC隐含地调用,因此您无法从代码中调用它。
笔记: 在C#中,最终确定方法不能被覆盖,因此您必须使用destructor的内部实现将覆盖MSIL中的最终方法。但是在VB.NET中,最终化方法可以被覆盖,因为它确实支持Destructors方法。
更新: 这里有有趣的半相关线程.