约瑟夫·阿尔巴哈里和本·阿尔巴哈里(奥莱利)在果壳中的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 code
,object.cs
文件不包含Finalize
方法。
我错过了什么?这是作者的错误吗?
答案 0 :(得分:4)
来自MSDN:
C#编译器不允许您覆盖Finalize方法。 相反,您通过为您的实现析构函数来提供终结器 类。 C#析构函数自动调用其基础的析构函数 类。
您必须使用~ClassName()
来实施destructor。
Object.cs
写在C#
中,因此它有~Object()
而不是Finalize()
。
来自Eric Lippert:
此功能令人困惑,容易出错,并且被广泛误解。它 具有C ++用户非常熟悉的语法,但令人惊讶的不同 语义。在大多数情况下,使用该功能是危险的, 不必要的,或有虫病的症状 有时您需要实现仅适用于专家的功能 建设基础设施;这些功能应该清楚标明 危险 - 与其他语言的功能不太相似。