众所周知, .Net代码属于managed code,即objects的内存的释放工作,由CLR代劳,programmer s通常不需要关注objects的内存释放问题。然而,.Net也提供了一些机制使programmers可以进行资源的释放工作。
析构函数
C++ style,便于c++programmers学习,运行机制类似于Finalize,参考示例1。
Finalize
如果一个object的内存将被释放时,需要通知该object,则可以override Object.Finalize方法。此时,当GC回收这个object的内存时,首先要确定该对象的Finalize方法已经被调用。故可以在Finalize方法体做一些资源清理工作,但禁忌处理一些耗时的工作。用法参考示例1。
示例1
public sealed class Transaction{
int lowLevelTX;
public Transaction()
{
lowLevelTX = raw.BeginTransaction();
}
//Finalizer
~Transaction()
{
if(lowLevelTX != 0)
{
raw.AbortTransaction(lowLevelTX);
}
}
/*
equivalent to ~Transaction
protected override void Fianlize()
{
if(lowLevelTX != 0)
{
raw.AbortTransaction(lowLevelTX);
}
base.Finalize();
}
*/
}
Dispose
当一个对象不再被使用时,GC并不会立即释放该内存。如果需要在一个对象不再被使用时,立即释放其占用的资源,可以使该对象类继承IDispose接口。从而,可以在该对象使用完成后,explictly call Dispose方法,或者使用using statement。参考示例2.
示例2
public sealed class Transaction:IDisposable{
int lowLevelTX;
public Transaction()
{
lowLevelTX = raw.BeginTransaction();
}
public void Dispose()
{
System.GC.SuppressFinalize(this);//抑制Finalizer
if(lowLevelTX != 0)
{
raw.AbortTransaction(lowLevelTX);
}
}
//Finalizer
~Transaction()
{
if(lowLevelTX != 0)
{
raw.AbortTransaction(lowLevelTX);
}
}
}