.net非托管资源的回收方法(2)

namespace 资源回收
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用using对实现IDisposable的类了进行资源管理
/*拿到一个对象的时候,首先判断这个对象是否实现了IDisposable接口,如果实现了,最好就用using包裹住这个对象,保证这个对象用完之后被释放掉,否则很可能出现资源泄露的问题
*/
            using (Telphone t1 = new Telphone())
            {
                t1.Open();
                t1.Speak("hello");
                t1.Bomb();
                //t1.Dispose();//如果在这里调用了Dispose()方法释放资源,那么在执行t1.Open()方法就出错,电话线已经被剪断了,无法再打电话了
                t1.Open();
                t1.Speak("I am back!");
            }//代码执行到这里后,就会调用Dispose方法来进行资源回收
            Console.ReadKey();
        }
    }
    /// <summary>
    /// Telphone类实现了IDisposable接口
    /// </summary>
    class Telphone : IDisposable
    {
        /// <summary>
        /// 电话状态
        /// </summary>
        private TelphoneState state;
        /// <summary>
        /// 打电话
        /// </summary>
        public void Open()
        {
            if (state == TelphoneState.Disposed)
            {
                throw new Exception("电话线已经被剪断,无法打开!");
            }
            state = TelphoneState.Open;
            Console.WriteLine("拿起电话");
        }
        /// <summary>
        /// 说话
        /// </summary>
        /// <param>说话内容</param>
        public void Speak(string s)
        {
            if (state != TelphoneState.Open)
            {
                throw new Exception("没有连接");
            }
            Console.WriteLine(s);
        }
        /// <summary>
        /// 挂掉电话
        /// </summary>
        public void Bomb()
        {
            state = TelphoneState.Close;
            Console.WriteLine("挂掉电话");
        }
        IDisposable 成员
    }
    /// <summary>
    /// 电话状态枚举
    /// </summary>
    enum TelphoneState
    {
        Open, Close, Disposed
    }
}


 
程序运行结果如下图所示:
 

.net非托管资源的回收方法

 
 
三、析构函数和IDisposable混合调用的例子

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjzdyz.html