要释放非托管的资源,可以通过重写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方法。