在C#中,类中的析构函数和Finalize方法有什么区别?
类中的析构函数和Finalize方法之间有什么区别(如果有的话) 我最近发现VisualStudio2008将析构函数视为Finalize方法的同义词,这意味着VisualStudio不允许在一个类中同时定义这两个方法 例如,以下代码片段:在C#中,类中的析构函数和Finalize方法有什么区别?,c#,destructor,finalize,C#,Destructor,Finalize,类中的析构函数和Finalize方法之间有什么区别(如果有的话) 我最近发现VisualStudio2008将析构函数视为Finalize方法的同义词,这意味着VisualStudio不允许在一个类中同时定义这两个方法 例如,以下代码片段: class TestFinalize { ~TestFinalize() { Finalize(); } public bool Finalize() { return true;
class TestFinalize
{
~TestFinalize()
{
Finalize();
}
public bool Finalize()
{
return true;
}
}
在析构函数中调用Finalize时出现以下错误:
以下方法或属性之间的调用不明确:
'TestFinalize.~TestFinalize()'和'TestFinalize.Finalize()'
如果Finalize调用被注释掉,则会出现以下错误:
类型“ManagementConcepts.Service.TestFinalize”已定义名为
使用相同的参数类型“Finalize”
~
符号。像-
Class MyClass
{
~MyClass()
{
.....
}
}
在VB.NET中,析构函数是通过重写Finalize来实现的
对象类的方法系统.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拆分为自己的可终结类(理想情况下,该类不应持有对其他对象的任何强引用),这意味着持有对其他对象的引用的类将只拥有“直接拥有非托管资源的对象”,而不是拥有