对象类型是否包含受保护的虚拟Finalize方法?

时间:2016-07-21 10:54:14

标签: c# .net finalizer mscorlib

  约瑟夫·阿尔巴哈里和本·阿尔巴哈里(奥莱利)在果壳中的C#6.0。

     

版权所有2016 Joseph Albahari和Ben Albahari,978-1-491-92706-9。

指出,在第100-101页,对象类成员是:

public class Object
{
    public Object();
    public extern Type GetType();
    public virtual bool Equals (object obj);
    public static bool Equals (object objA, object objB);
    public static bool ReferenceEquals (object objA, object objB);
    public virtual int GetHashCode();
    public virtual string ToString();
    protected virtual void Finalize(); //<-- this one
    protected extern object MemberwiseClone();
}

这促使我去检查VS's intellisense是否为任何参考实例提供了Finalize()方法,因为我不记得曾见过。

我没有成功获得这样一个继承了Finalize成员的对象(我试图在函数内部访问它,意识到它受到保护)。

我检查了.NET's open source codeobject.cs文件不包含Finalize方法。

我错过了什么?这是作者的错误吗?

1 个答案:

答案 0 :(得分:4)

来自MSDN

  

C#编译器不允许您覆盖Finalize方法。   相反,您通过为您的实现析构函数来提供终结器   类。 C#析构函数自动调用其基础的析构函数   类。

您必须使用~ClassName()来实施destructor

Object.cs写在C#中,因此它有~Object()而不是Finalize()

我建议您阅读此article和此answer

来自Eric Lippert

  

此功能令人困惑,容易出错,并且被广泛误解。它   具有C ++用户非常熟悉的语法,但令人惊讶的不同   语义。在大多数情况下,使用该功能是危险的,   不必要的,或有虫病的症状   有时您需要实现仅适用于专家的功能   建设基础设施;这些功能应该清楚标明   危险 - 与其他语言的功能不太相似。