出于好奇,我反汇编了mscorlib.dll以检查System.Object类的实现。
我发现了一些奇怪的东西。
1).
public class Object {
...
protected override void Finalize(){}
...
}
为什么基类中有覆盖方法?
2) public class Employee {
public void InstanceMethod() {
this.Finalize();
//Does not compile, can i not access protected methods of base class??
}
}
我只是想知道在Object类中使用“protected Finalize”方法有什么用处,以及为什么它会被编译器特殊处理?
答案 0 :(得分:4)
这是Reflector中的一个错误,它被一个虚拟但没有“newslot”属性并且没有基类类型的方法搞糊涂了。将反编译器切换到IL时可能更容易看到。
从参考源复制的终结器的真实声明与您期望的一样:
// Allow an object to free resources before the object is reclaimed by the GC.
//
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
~Object()
{
}
答案 1 :(得分:1)
对于第二个问题,C#的~MyClass
用VB.NET编写为Protected Overrides Sub Finalize()
,相当于protected override Finalize()
。所以这只是C#语法的区别。
对于第一个问题,在Reflector中它是
.method family hidebysig virtual instance void Finalize() cil managed
缺少newslot
属性,与重写相比,通常会在新虚拟成员上看到。
答案 2 :(得分:0)
查看MSDN到Object.Finalize:
析构函数是执行清理操作的C#机制。析构函数提供适当的安全措施,例如自动调用基类型的析构函数。在C#代码中,无法调用或覆盖Object.Finalize。
因此,你的问题的答案是:嗯 - 这是CLR内部的一部分; C#编译器完成编写时所需的所有工作,例如:
public class Employee
{
//Finalizer, also known as "destructor"
~Employee()
{
}
}