zoukankan      html  css  js  c++  java
  • C#处理非托管资源

    using System;
    
    //处理非托管资源
    //例如:文件句柄、网络连接、数据库连接
    
    //实现IDisposable不意味着也应该实现一个终结器,终结器会带来额外开销
    //发布本机资源,要释放本机资源就需要终结器
    
    //如果实现了终结器,也应该实现IDisposabel接口
    //这样本机资源可以早些释放
    
    namespace ConsoleApp
    {
        //1.析构函数或终结器
        class MyClass
        {
            //C#无法确定对象的析构函数何时执行
            //会有延迟
            //频繁使用析构函数,而且使用它们执行长时间的清理任务,对性能影响就会非常显著
            ~MyClass()
            {
                //其实是Finalize()方法
            }
        }
    
        //2.实现System.IDisposable
        class MyClass1 : IDisposable
        {
            public void Dispose()
            {
            }
        }
    
        //3.双重实现
        class MyClass2 : IDisposable
        {
            //表示对象是否已被清理
            private bool _isDisposed = false;
            public void Dispose()
            {
                //...
                Dispose(true);
                GC.SuppressFinalize(this);//告诉回收器不需要调用析构函数了
    
            }
    
            protected virtual void Dispose(bool disposing)
            {
                if (!_isDisposed)
                {
                    if (disposing)
                    {//...
                        //清理托管资源 
                    }
                    //...
                    //清理非托管
                }
                _isDisposed = true;
            }
    
            ~MyClass2()//只清理非托管
            {
                Dispose(false);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                MyClass1 theInstance = null;
                //使用try/finally确保发生异常也能释放资源
                try
                {
                    theInstance = new MyClass1();
                }
                finally
                {
                    theInstance?.Dispose();
                }
    
                //如果这些大括号过多很容易混淆
                //也可以使用using来完成此工作,在变量超出作用域会自动调用Dispose()
                using (var ins = new MyClass1())
                {
                    //...
                }
    
            }
        }
    }
  • 相关阅读:
    BZOJ 5314: [Jsoi2018]潜入行动
    BZOJ 3420: Poi2013 Triumphal arch
    BZOJ 1135: [POI2009]Lyz
    BZOJ 4247: 挂饰
    本地
    生成config文件到内存中
    微信获取access_token和curl
    php生成静态页面
    curl
    分页
  • 原文地址:https://www.cnblogs.com/xslwm/p/9590906.html
Copyright © 2011-2022 走看看