C#中的析构函数

来源:互联网 发布:海量数据存储 试题 编辑:程序博客网 时间:2024/04/29 11:41

    任何封装了非托管资源的类型,都必须支持一个称为终止化(finalization)的操作,终止化操作允许一种资源在它所占有的的内存被回收之前执行一些清理工作,为此,我们必须为该类型重写一个继承自Object的名叫Finalize的方法。如果类型没有重写Finalize方法,那么非托管资源将得不到关闭,一直到进程结束,非托管资源才会被操作系统回收。(当然那是我们没有显式关闭非托管资源的情况,当然我们有别的辅助的资源处置方式,例如实现IDisposable接口,在使用这种对象时使用using语句。)

    但在C#中不能调用或重写finalize方法,由于C#编译组发现许多开发人员对Finalize方法的实现不够正确,例如开发人员忘记在Finalize方法中对异常情况进行处理,为此C#为定义Finalize方法提供了特殊的语法,那就是析构器,语法类似于C++的析构函数 --- ~类名(){} ,在编译后的IL代码里,自动将其包装到Finalize语句中。析构函数没有任何参数、返回类型和访问修饰符。

    一般情况最好不要执行析构函数,根据GC的工作方式,没有析构函数的对象会在GC的一次处理中从内存中删除,但有析构函数的需要两次才能处理才能删除。

   要注意的是CLR不支持确定性的析构,也就是Finalize方法只有在GC执行时才被调用,而不会在一个对象超出作用范围时被调用。(这一点与C++不同),因此不要在析构函数中引用其他托管对象,因为我们无法预计对象的删除顺序。

    在设计类时,尽可能避免使用Finalize方法,如果要释放非托管资源建议使用实现IDisposable接口的方法。

原创粉丝点击