zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Medication Reconciliation Overview
    The Info-Button Standard: Bring Meaningful Use To the Patient
    Configuring Time in Windows 7 and Win 200
    oracle补齐日期
    mysql-proxy
    Oracle:Authid Current_User的使用
    oracle的sqlldr常见问题
    hive的select重命名字段显示成中文
    python访问hive
    禁用SSL v2.0、SSL v3.0协议
  • 原文地址:https://www.cnblogs.com/Finding2013/p/3030283.html
Copyright © 2011-2022 走看看