zoukankan      html  css  js  c++  java
  • 改善C#程序的建议4:C#中标准Dispose模式的实现

    需要明确一下C#程序(或者说.NET)中的资源。简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类:

    托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象;

    非托管资源:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、COM对象等;

    毫无例外地,如果我们的类型使用到了非托管资源,或者需要显式释放的托管资源,那么,就需要让类型继承接口IDisposable。这相当于是告诉调用者,该类型是需要显式释放资源的,你需要调用我的Dispose方法。

    不过,这一切并不这么简单,一个标准的继承了IDisposable接口的类型应该像下面这样去实现。这种实现我们称之为Dispose模式:

    publicclass SampleClass : IDisposable
    {
    //演示创建一个非托管资源
    private IntPtr nativeResource = Marshal.AllocHGlobal(100);
    //演示创建一个托管资源
    private AnotherResource managedResource =new AnotherResource();
    privatebool disposed =false;

    ///<summary>
    /// 实现IDisposable中的Dispose方法
    ///</summary>
    publicvoid Dispose()
    {
    //必须为true
    Dispose(true);
    //通知垃圾回收机制不再调用终结器(析构器)
    GC.SuppressFinalize(this);
    }

    ///<summary>
    /// 不是必要的,提供一个Close方法仅仅是为了更符合其他语言(如C++)的规范
    ///</summary>
    publicvoid Close()
    {
    Dispose();
    }

    ///<summary>
    /// 必须,以备程序员忘记了显式调用Dispose方法
    ///</summary>
    ~SampleClass()
    {
    //必须为false
    Dispose(false);
    }

    ///<summary>
    /// 非密封类修饰用protected virtual
    /// 密封类修饰用private
    ///</summary>
    ///<param name="disposing"></param>
    protectedvirtualvoid Dispose(bool disposing)
    {
    if (disposed)
    {
    return;
    }
    if (disposing)
    {
    // 清理托管资源
    if (managedResource !=null)
    {
    managedResource.Dispose();
    managedResource
    =null;
    }
    }
    // 清理非托管资源
    if (nativeResource != IntPtr.Zero)
    {
    Marshal.FreeHGlobal(nativeResource);
    nativeResource
    =
  • 相关阅读:
    DataTable
    asp.net2.0异步页面和异步web部件
    Ref 和Out 区别
    关于String str =new String("abc")和 String str = "abc"的比较
    MongoDB介绍及安装
    通过MongoDB的samus驱动实现基本数据操作
    SQL 联合索引 与 单一列的索引 比较
    C#字符串处理(String与StringBuilder)
    C#操作文件夹及文件的方法的使用
    常见的sql语句 注意点及用法【区分mysql 和Sqlserver】
  • 原文地址:https://www.cnblogs.com/xyqCreator/p/2626436.html
Copyright © 2011-2022 走看看