• 类中实现 Dispose And Finalize


    1.Dispose方法中,应该使用GC.SuppressFinalize防止GC调用Finalize方法,因为显示调用Dispose比较好。

    2.Disposed字段保证了两次调用Dispose方法不会抛出异常。

    3.同时实现Finalize方式和Dispose方式,一方面Dispose方法可以克服Finalize方法在性能上的弊端;另一方面,Finalize方法又能确保没有显式调用Dispose方法时,也自行回收使用的所有资源。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DisposeAndFinalize
    {
        class FileDealer:IDisposable 
        {
            //定义一个访问文件资源的Win32句柄
            private IntPtr fileHandle;
            //定义应用的托管资源
            private ManagedRes managedRes;
            //标记dispose是否已被调用
            private bool Disposed = false; 
            //定义构造器,初始化托管资源和非托管资源
            public FileDealer(IntPtr handle,ManagedRes res)
            {
                fileHandle = handle;
                managedRes = res;
            }
            //实现终结器,定义Finalize
            ~FileDealer()
            {
                if (fileHandle != IntPtr.Zero)
                {
                    Dispose(false);
                }
            }
            //实现IDisposable接口
            public void Dispose()
            {
                Dispose(true);
                //阻止GC调用Finalize方法
                GC.SuppressFinalize(this);
            }
    
            //实现一个处理资源清理的具体方法
            protected virtual void Dispose(bool disposing)
            {
                if(!Disposed )
                {
                if (disposing)
                {
                    //清理托管资源
                    managedRes.Dispose();
                }
                //执行资源清理,在此为关闭对象句柄
                if(fileHandle!=IntPtr.Zero)
                {
                    CloseHandle(fileHandle);
                    fileHandle = IntPtr.Zero;
                }
                }
                Disposed = true;
            }
            public void Close()
            {
                //在内部调用Dispose来实现
                Dispose();
            }
            //实现对文件句柄的其他应用方法
            public void Write() { }
            public void Read() { }
            //引入外部Win32API
            [DllImport("Kernel32")]
            private extern static Boolean CloseHandle(IntPtr handle);
        }
    }
  • 相关阅读:
    导入已有项目到svn
    Linux用ICMP协议实现简单Ping网络监测功能
    c++ tcp 服务器和客户端例子
    C++ Socket 编程
    c++工厂模式和多线程结合
    Linux中ls命令详解
    Mac OS X 11中的/usr/bin 的“Operation not permitted”
    Warning: mysql_connect(): No such file or directory 解决方案总结(操作系统: Mac)
    页面组件渲染小组件(重点)
    Vue 路由
  • 原文地址:https://www.cnblogs.com/tylertang/p/4136896.html
Copyright © 2020-2023  润新知