C# IDispose使用实例

复制代码
using System;
using System.ComponentModel;

//下面的例子演示了如何创建
//实现IDisposable接口的资源类
//和IDisposable。处理方法。

public class DisposeExample
{
//实现IDisposable的基类。
//通过实现IDisposable,你宣布
//这种类型的实例分配稀缺资源。
    public class MyResource: IDisposable
    {
        // 指向外部非托管资源的指针。
        private IntPtr handle;
        // 该类使用的其他托管资源。
        private Component component = new Component();
        // 跟踪是否调用了Dispose。
        private bool disposed = false;

       //类的构造函数。
        public MyResource(IntPtr handle)
        {
            this.handle = handle;
        }
       //实现IDisposable。
       //不要将此方法设为虚方法。
        //派生类不能重写此方法。
        public void Dispose()
        {
            Dispose(disposing: true);
           //该对象将被Dispose方法清除。
          //因此,应该调用GC。SuppressFinalize来将此对象从终结队列中移除
          //并阻止此对象的终结代码从执行第二次。
            GC.SuppressFinalize(this);
        }
      //在两个不同的场景中执行Dispose(bool Dispose)。
     //如果dispose = true,则直接调用了该方法
     //或间接地由用户的代码。受管资源和非受管资源
    //可以处理。
    //如果dispose = false,则该方法已被
    //终止器内部的运行时,你不应该引用
    //其他对象。只能处置非托管资源。
        protected virtual void Dispose(bool disposing)
        {
            //检查是否已经调用了Dispose。
            if(!this.disposed)
            {
                //如果处置等于true,处置所有已管理的非托管资源。
                if(disposing)
                {
                    // 处置托管资源。
                    component.Dispose();
                }

              //调用适当的方法进行清理
              //这里的非托管资源。
              //如果处置为false,
              //只执行以下代码。
                CloseHandle(handle);
                handle = IntPtr.Zero;

              //处理完成。
                disposed = true;
            }
        }

        //使用interop调用必要的方法清理非托管资源。
        [System.Runtime.InteropServices.DllImport("Kernel32")]
        private extern static Boolean CloseHandle(IntPtr handle);

        //使用c#终结器语法来终结代码。
       //只有当Dispose方法被调用时,这个终结器才会运行
       //不被调用。
      //它给基类一个完成的机会。
       //不要在该类派生的类型中提供终结器。
        ~MyResource()
        {
           //不要在这里重新创建Dispose清理代码。
           //调用Dispose(Dispose: false)是最优的
          //可读性和可维护性。
            Dispose(disposing: false);
        }
    }
    public static void Main()
    {
       //在这里插入代码创建
       //并使用MyResource对象。
    }
}
复制代码

 

posted @   小码哥-风云  阅读(115)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
点击右上角即可分享
微信分享提示