zoukankan      html  css  js  c++  java
  • 类中实现 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);
        }
    }
  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/tylertang/p/4136896.html
Copyright © 2011-2022 走看看