zoukankan      html  css  js  c++  java
  • 补充ZendyHu对Finalize和IDispose异同的说明

    ZendyHu 在他的文章 对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会 中说了一下他对于.net垃圾回收的一些理解,不过个人认为他并没有说的很明白,所以补充说明一下。

    道理其实很简单,因为Finalize是系统调用的,调用之前已经把该对象中多有的托管资源放到了垃圾回收队列中,所以Finalize中不需要重复释放托管资源,而只需要释放非托管资源。

    而Dispose是 IDisposable 的成员函数,.net 的垃圾回收机制中并不认识这个接口,这个接口是为程序员们准备的。当我们主动调用Dispose的时候,对象并没有放到垃圾回收队列中,所以需要同时也处理对象中所有的托管资源。

    当然,你不使用 Dispose(bool disposing) 也可以,因为它从根本上来说只是为了减少冗余而让Finalize和Dispose共用的函数后端代码而已。你如果把代码修改成不用Dispose(bool)也是完全正确的:

    [代码1]
    ~Class()
    {
        ClearUnManagedResource();
    }

    void Dispose()
    {
        ClearManagedResource();
        ClearUnManagedResource();
    }

    而把代码1修改成使用 Dispose(bool) 的话,就是如下:
    [代码2]
    ~Class()
    {
        Dispose(false);
    }

    void Dispose()
    {
        Dispose(true);
    }

    void Dispose(bool disposing)
    {
        if( disposing )
            ClearManagedResource();

        ClearUnManagedResource();
    }

    我看,代码2这种方法还不如代码1来得容易看,而且因为一个Dispose的名字引出来这么多的问题,耗费大家这么多的时间,真是罪孽阿。

  • 相关阅读:
    HTTP
    nginx反向代理和负载均衡
    keepalive
    lnmp
    DNS
    jumpserver跳板机
    博客已搬家到CSDN
    JAVA中关于上传图片到数据库和从数据库取出显示图片的问题
    checkbox的标签和全选中问题
    SOCKET
  • 原文地址:https://www.cnblogs.com/BigTall/p/152901.html
Copyright © 2011-2022 走看看