再看Finalize方法

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航