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())
            {
                //...
            }

        }
    }
}
原文地址:https://www.cnblogs.com/xslwm/p/9590906.html