为什么不允许Finalize方法覆盖

som*_*raj 5 .net c#

我是.net的新手.我对C#中的析构函数机制感到困惑.请澄清

在C#中,析构函数由CLR转换为finalize方法.如果我们尝试覆盖它(不使用析构函数),将收到错误错误2不要覆盖object.Finalize.相反,提供一个析构函数.

但似乎mscorlib.dll中的Object calss实现已将finalize定义为protected override void Finalize(){},那么为什么我们无法覆盖它,那是什么虚函数.

为什么这样的设计,是否与c ++析构函数概念一致.

另外,当我们去定义对象类时,没有提到finalize方法,那么hmscorlib.dll定义如何显示finalize函数.这是否意味着默认析构函数转换为finalize方法.

public class Object
{     

    public Object();
    public virtual bool Equals(object obj);        
    public static bool Equals(object objA, object objB);       
    public virtual int GetHashCode();       
    public Type GetType();      
    protected object MemberwiseClone();  
    public static bool ReferenceEquals(object objA, object objB);
    public virtual string ToString();
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 20

我是.NET的新手,我对C#中的析构函数机制感到困惑.请澄清.

当然.我同意这令人困惑.

在C#中,析构函数由CLR转换为finalize方法.

正确.好吧,我会说这是由C#编译器完成的,而不是CLR,但我理解你的意思.

如果我们尝试覆盖它(不使用析构函数),则会收到错误"不要覆盖object.Finalize.而是提供析构函数."

正确.

似乎mscorlib.dll中的Object类实现已将finalize定义为protected override void Finalize(){}

正确.

那为什么我们不能覆盖呢?这就是虚拟功能的用途.

因为那时会有两种方法来编写析构函数.那会令人困惑.我们希望只有一种方法来编写析构函数.

为什么这样的设计?是否与c ++析构函数概念一致?

这是一个原因,是的.还有其他原因.以下是一些:

  • 通过在逻辑上分离"析构函数"和"覆盖终结方法"的概念,我们可以通过其他环境中的其他机制实现析构函数.这还没有发生,但是未来我们可能会编写一个C#版本,比如用于在具有与标准CLR语义不同的垃圾收集器语义的环境中构建设备驱动程序.在该环境中,析构函数的语义可能更像是C++析构函数的语义,而不像GC终结器.

  • 终结器是非常特殊的方法.你不能像常规方法那样称呼它们; 只有垃圾收集器可以调用它们.他们有不同的异常处理规则.它们必须确保在派生类终结器之后严格调用基类终结器.它们非常特殊,将它们暴露为任何其他方法似乎很危险.如果你有一种方法只是坐在那里你可以打电话,你可以把任何你想要的东西,等等,这使得很容易忘记终结者的特殊性.有一个特殊的语法强调这是特殊的代码.

另外,当我们转到对象类的定义时,没有提到finalize方法,那么mscorlib.dll定义如何显示finalize函数.

假设我们在对象浏览器中显示了一个名为MagicUnicorn的方法,如果你试图调用它或覆盖它,你会收到一个错误,说"不要那样做!".如果你不能做任何事情,为什么还要费心去展示MagicUnicorn方法呢?那只是无益的噪音.

现在,如果您反汇编mscorlib,那么当然真的有特殊的Finalize方法.

这是否意味着默认析构函数转换为finalize方法.

是.


Sam*_*ell 0

要覆盖Finalize(),您必须使用终结器语法。CLI 在内部对某些事物使用固定名称,例如所有名为 的实例构造函数.ctor和所有名为 的静态构造函数.cctor。当 C# 编译器编写输出程序集时,它确保对其发出的项使用正确的名称,其中包括将析构函数编写为具有名称Finalize()而不是~T(). 其他 .NET 语言的编译器也必须遵循这些相同的规则来处理它们自己的语义。

class A
{
    ~A() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

对于终结器的时间和方式,请在此处查找有关终结器和 的许多其他问题IDisposable