再看Finalize方法

要释放非托管的资源,可以通过重写Finalize方法或者析构方法来实现资源的释放。对于VB.NET,必须重写Finalize方法。而托管C++和C#则要求用析构函数的写法来实现Finalize方法的功能。
对于如下的C#代码:
public class Base
{
public Base(){}
~Base(){Console.WriteLine("Base finalize");}

}

public class Subclass:Base
{
public Subclass(){}
~Subclass(){Console.WriteLine("Subclass finalize");}

}

看一下类Base的~Base()元数据:
.method family hidebysig virtual instance void
Finalize() cil managed
{
// Code size 20 (0x14)
.maxstack 1
.try
{
IL_0000: ldstr "Base finalize"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: leave.s IL_0013
} // end .try
finally
{
IL_000c: ldarg.0
IL_000d: call instance void [mscorlib]System.Object::Finalize()
IL_0012: endfinally
} // end handler
IL_0013: ret
} // end of method Base::Finalize

看一下类Subclass的~Subclass()元数据:
.method family hidebysig virtual instance void
Finalize() cil managed
{
// Code size 20 (0x14)
.maxstack 1
.try
{
IL_0000: ldstr "Subclass finalize"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: leave.s IL_0013
} // end .try
finally
{
IL_000c: ldarg.0
IL_000d: call instance void Base::Finalize()
IL_0012: endfinally
} // end handler
IL_0013: ret
} // end of method Subclass::Finalize

通过元数据,易知对于用析构函数的方式来实现Finalize方法,编译器会自动加入对于基类的Finalize方法的调用。
对于VB.NET来说,则必须重写Finalize方法。通过元数据,你可以看到重写Finalize是不会调用基类的Finalize方法的。所以,你应该根据需要,在重写的Finalize函数中显式的调用基类的Finalize方法。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus