cangfriend

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

今天复习了一下C#基础知识,刚好看到了析构函数这里,有了进一步了解,记录一下,与君共勉

~类名()

{

      //一些要释放的代码

}

 

“~”做前缀,加类名就构成了析构函数。

我们不能自己调用析构函数,它是在.NET垃圾收集过程中调用的。我简单测试了一些,在WinForm中简单调用类,当窗口关闭时,会调用这个类的析构函数。

我用想用到析构函数,是因为在处理过程中,要根据实际情况,在不同时期释放和建立新的对象。

按照MSDN上的话,如果你的代码中包含需要及时清理的非托管资源,别把它留给析构函数处理,因为不能保证析构函数会很快运行(.NET垃圾收集我们应该控制不了吧)。我们可以把资源的清理代码封装在一个VOID类型的无参数方法中,一般叫做Dispose。

例如我写的一个基类:

public class CSMOBasic
    {

private bool disposed = false;

public CSMOBasic()
{
    #region 构造代码
    #endregion
}

#region 析构函数,和清理函数

/// <summary>
/// 析构函数
/// </summary>
~CSMOBasic()
{
    //
    Dispose(false);
}

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (disposed == false)
    {
        if (disposing == true)
        {
            //
            //释放非托管资源的代码
        }
        //
        //释放托管资源的代码
    }
    disposed = true;
}

#endregion

}

我们就可以在代码中根据需要调用Dispose函数释放非托管资源啦。

不过我没搞清楚 什么算托管资源,什么是非托管资源。

因为我要用到TcpClient,这个要根据需要手工释放,在概念上算不算 非托管资源???

我又写了派生类,析构函数和Dispose函数如下写法:

 

public class CSMOTest : CSMOBasic
    {
        private bool disposed = false;
        //
        public CSMOTest()
        {
            //
            disposed = false;
        }
        //

        #region 析构函数,和清理函数

        ~CSMOTest()
        {
            Dispose(false); //当派生类被执行析构函数时,会自动调用基类析构函数
        }

        new public void Dispose()//我是这么写的,不知道对不对,
        {
            Dispose(true);
            GC.SuppressFinalize(this);
            //
            base.Dispose();    //这里要手工调用基类的Dispose函数,否则不会自动调用
        }

        new protected virtual void Dispose(bool disposing)
        {
            if (disposed == false)
            {
                if (disposing == true)
                {
                    //_strLine = "000";
                    ////释放非托管资源的代码

                }
                //_strLine = "000";
                //释放托管资源的代码
            }
            disposed = true;
        }

        #endregion

    }

 

哈哈,先记录到这里。

posted on 2009-09-10 21:19  BruceZhou  阅读(5630)  评论(0编辑  收藏  举报