zoukankan      html  css  js  c++  java
  • 标准IDispose模式浅析

    标准IDispose模式浅析

    DoNet资源

    众所周知,.Net内存管理分托管资源和非托管资源,把内存中的对象按照这两种资源划分,然后由GC负责回收托管资源(Managed Resource),而对于非托管资源来讲,就需要程序员手动释放。

             Framework的设计者的本意是降低Developer的入门难度,提高开发效率,让使用者更少的关注“垃圾回收”,但也正是如此的封装,才导致越来越多的滥用,甚至可怕的效率低下。(这里,我本人强调的是对DoNet垃圾回收机制的理解程度导致的滥用现象。)常常有人抱怨资源一直没有被回收,或者没有按照时间点回收,或者创建再生资源时,效率低下。(“再生资源”指刚刚被完全释放的资源,依据《.Net设计规范》中的说法,不适当的回收导致在创建时的效率低下。)

             说了这些就是想提醒大家,我们要有一个更正确,更完善的方式回收资源。

     

    IDisposable接口

             在Framework的设计中很多地方都实现了IDisposable接口的Dispose方法,GC会自动地,随机地调用某个资源的析构方法,从而达到自动回收垃圾的目的,该接口来自于System命名空间下。

             所以,对于我们自定义的类来讲一般都要实现IDisposable接口,已完成自动回收。

     

    标准IDispose模式

             不罗嗦了,网上相关的资料很多,这里写下来也是让自己更熟悉这种模式,毕竟理解是一回事,讲解出来又是另一回事。

             首先引用IDisposable接口,然后,没有然后了,直接贴代码:

     

    复制代码
     
    
    #region 标准IDispose模式
    
    Private bool disposed = false;
    
    Public void Dispose()
    
    {
    
             Dispose(true);
    
             GC.SuppressFinalize(this);
    
    }
    
    ~XXXXClass()
    
    {
    
             Dispose(false);
    
    }
    
    Protected virtual void Dispose(bool disposing)
    
    {
    
             If(disposed)
    
             Return;
    
             If(disposing)
    
            {
    
                      If(Resource != null)
    
                      {
    
                                // Release managed resource
    
                      }
    
            }
    
             // Release unmanaged resource
            disposed = true;
    
    }
    
    #endregion 
    复制代码

     

    1. GC.SuppressFinalize(this); 这个方法是告诉GC一个对象已经手动释放过,并且不需要再释放了,这样的话,对象能被更早的再生。一般是紧跟在Dispose(true)之后。
    2. ~XXXXClass()析构函数,函数释放时自动执行。其中Dispose(false)程序自动调用时,只回收非托管资源。
    3. Protected virtual void Dispose(bool disposing) 标识为 Protect 是为了更好的封装,virtual是便于继承类重写。
    4. 对于某些资源的释放要做如下三部:

    a)         A != null如果为空的话,不用释放。

    b)         A.Dispose();

    c)         A == null;

    1. GC回收资源是靠将资源标记成(Generate)代的概念,0代则直接回收,1代减一变成0代,2代回收时减一变成1代。
    2. GC.Collect()就是手动将资源标记的方法,但是即使是0代也未必立即回收释放。

     

     

     

    Reference

    《.Net设计规范》(Framework Design Guideline)

    http://msdn.microsoft.com/zh-cn/library/System.GC(v=vs.80).aspx

     

     


    工程狮必备属性:追新,执着,高内聚低耦合。 
    版权声明:凡是没有标注[转载]的,在引用文章时,均要加上本博客地址,谢谢。 
    http://www.cnblogs.com/cuiyansong/。
     
    分类: 读书笔记
  • 相关阅读:
    POJ 3009
    POJ 3253
    POJ 3617
    POJ 3984
    UVA10012
    HDU5100
    HDU 5101
    UVA301 运输
    UVA 331 交换的方案数
    uva 10344 算23点
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3746668.html
Copyright © 2011-2022 走看看