C# 释放资源的规范写法

static class CSharp_3 {
        /* ----------------------------------------
         * 以下学习资源的释放:IDispose和析构函数
         * 1、IDispose
         * 2、析构函数
         * 一般情况下,最好的方法是实现这两种机制,获得这两种机制的优点,克服其缺点。因此最好是我们实现两种机制。
         * ----------------------------------------
         */
        [STAThread]
        static void Main() {
            //示例如下:
            MyResourceClass sampleObject = new MyResourceClass();
            //....................
            //释放资源
            sampleObject.Dispose();
            sampleObject = null;
        }
    }
    /* --------------------------------
     * 释放资源例子:
     * 实现两种机制确保资源能够释放
     * https://msdn.microsoft.com/zh-cn/library/fs2xkftw(v=vs.110).aspx
     * --------------------------------
     */
    public class MyResourceClass : IDisposable {
        /// <summary>
        /// 标记是否已调用Dispose(bool)的变量
        /// </summary>
        private bool isDisposed = false;
        /// <summary>
        /// 实现的IDispose接口
        /// 由于公共、非虚拟的、无参数 Dispose 方法由该类型的使用者调用,因此其用途是【释放非托管资源和托管资源】和指示终结器(如果存在)不必运行。 因此,它具有标准实现。
        /// </summary>
        public void Dispose() {
            //释放非托管资源和托管资源
            Dispose(true);
            //指示终结器(如果存在)不必运行
            GC.SuppressFinalize(this);
        }
        /*-----------------------------------------
         * Dispose(Boolean) 重载:
         * 参数: disposing, 是一个 Boolean,它指示方法调用是来自 Dispose 方法(其值为 true)还是来自终结器(其值为 false)。
         * 主体包含两个代码块:
         * 代码块1:释放非托管资源的块。 无论 disposing 参数的值如何,都会执行此块。
         * 代码块2:释放托管资源的条件块。 如果 disposing 的值为 true,则执行此块。
         * ----------------------------------------
         */
        protected virtual void Dispose(bool disposing) {
            if (!isDisposed) {
                if (disposing) {
                    /*此处【代码块2】:释放所有的托管对象:指被CLR(公共语言运行库:dotnet运行库)控制的内存资源,常见的托管资源:
                     * int,
                     * string,
                     * float,
                     * DateTime等等,
                     * .net中超过80%的资源都是托管资源。
                     * ---
                     * ---
                    */
                }
            }
            else {
                return;
            }


            /*此处:【代码块1】:释放所有的非托管对象:指CLR(公共语言运行库:dotnet运行库) 不能控制和管理的部分,如文件流,数据库连接,网络连接,GDI+,Com对象,系统的窗口句柄,打印机资源等,下面列举一下常见的非托管类型:
             * ApplicationContext,
             * Brush,
             * Connection,
             * Component,
             * ComponentDesigner,
             * Container,
             * Context,
             * Cursor,
             * Stream,
             * FileStream,
             * Font,
             * Icon,
             * Image,
             * Matrix,
             * Object,
             * OdbcDataReader,
             * OleDBDataReader,
             * Pen,
             * Regex,
             * Socket,
             * StreamWriter,
             * StreamReader,
             * Timer,
             * Tooltip
             * --
             */

            this.isDisposed = true;
        }

        /// <summary>
        /// 析构函数
        /// </summary>
        ~MyResourceClass() {
            //释放非托管资源
            Dispose(false);
        }

        /// <summary>
        /// 功能示例方法
        /// </summary>
        public void Something() {
            //判定资源是否已释放过
            if (this.isDisposed) {
                throw new ObjectDisposedException("MyResourceClass");
            }
            /*此处:添加功能代码
             * ---
             * ---
             */
        }
    }

 

posted on 2016-08-18 10:54  shaozhuyong  阅读(3073)  评论(0编辑  收藏  举报