我是 .net 新手,对 C# 中的析构函数机制感到困惑,请解释一下。
在 C# 中,CLR 将析构函数转换为 finalize 方法。如果我们尝试覆盖它(而不是使用析构函数),会出现错误 Error 2 Do not override object.Finalize. Instead, provide a destructor.。
但是,看起来 mscorlib.dll 中的 Object 类实现已将 finalize 定义为 protected override void Finalize(){},那么为什么我们不能覆盖它,这是虚函数的作用。
为什么设计成这样,是为了与 C++ 的析构函数概念保持一致吗。
另外,当我们查看 object 类的定义时,没有提到 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();
}
GC.SuppressFinalize()
和GC.KeepAlive()
名称的情况下正确地使用析构器?如果C#提供了调用此类函数的语法(而无需使用特定于框架的名称),则我可能会看到析构器语法的某些价值。另一方面,如果编写一个适当的自清理对象需要使用至少两个特定于框架的GC.*
方法,那么小部分谜题是特定于语言的而不是特定于框架的价值是什么,我不确定。我错过了什么吗? - supercat