析构函数、Finalize和Dispose

众所周知, .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);

       }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值