• IDisposable


    .net中所有托管资源均有GC自动回收,那非托管资源怎么办呢?

    IDisposable接口就是设计用来显示释放非托管资源,如果是直接调用dispose方法,则无需再经由finalizer方法去调用this.Dispose(false)去释放托管资源,所以需在Dispose()方法中加上

    GC.SuppressFinalize(this);
    以提醒系统无需再调用析构函数,所有托管、非托管资源均会在Dispose(True)方法中释放,否则仍由Finzlizer方法调用Dispose(false)方法以便释放非托管资源,托管资源由GC直接回收
      public class MyBaseResourceManager : IDisposable
        {
            // Dispose是否被调用
            private bool isDisposed = false;
            protected string Name = "Name";
           
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
            protected virtual void Dispose(bool disposing)
            {
                if (!isDisposed)
                {
                    if (disposing)
                    {
                        //Code to 释放托管资源
                    }
                    //Code to 释放非托管资源
                }
                isDisposed = true;
            }
            // 析构函数只会在我们没有直接调用Dispose方法的时候调用
            // 派生类中不用在次提供析构函数
            ~MyBaseResourceManager()
            {
                Dispose(false);
            }
        }
    
        public class MyResourceManager : MyBaseResourceManager
        {
            private bool disposed = false;
          
            protected override void Dispose(bool disposing)
            {
                if (!disposed)
                {
                    try
                    {
                        if (disposing)
                        {
                            //Code To 释放托管资源
                        }
                        //Code To 释放非托管资源
                    }
                    finally
                    {
                        base.Dispose(disposing);
                    }
                }
                
            }
        }

    使用Using关键字,即可在using中代码执行结束后自动调用对象mr的dispose方法,如下所示

    static void Main()
            {
                using (MyResourceManager mr = new MyResourceManager())
                {
                }

     参见:http://www.cnblogs.com/carysun/archive/2008/06/15/Dispose.html

  • 相关阅读:
    用Javascript进行简单的Table点击排序.
    asp也来玩三层?
    用在JavaScript的RequestHelper
    一个JavaScript方法的演变
    自己动手,实现jQuery中的ImageCopper.
    notes on relations
    mutex and condition variable
    virtual destructor
    virtual inheritance
    一道概率题
  • 原文地址:https://www.cnblogs.com/Finding2013/p/3030283.html
Copyright © 2020-2023  润新知