zoukankan      html  css  js  c++  java
  • 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");
                }
                /*此处:添加功能代码
                 * ---
                 * ---
                 */
            }
        }
    
  • 相关阅读:
    jieba分词
    hue审计记录-记录用户的查询记录(用户前端删除,后端也不会删除)
    nginx1.16.1平滑升级到1.18
    mysql5.7.24升级到5.7.30 rpm部署模式 redhat7
    ldap无法启动 system library:fopen:Permission denied bss_file.c:402
    hive练习-行列转换 窗口函数
    linkis重编译适配cdh
    redhat7 安装mysql5.15
    hive 自动加载分区 --动态分区
    最近搞了个客户端
  • 原文地址:https://www.cnblogs.com/shaozhuyong/p/5783171.html
Copyright © 2011-2022 走看看