zoukankan      html  css  js  c++  java
  • C# 类的析构函数和释放函数

    今天复习了一下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
    
        }

    转载:https://www.cnblogs.com/cangfriend/archive/2009/09/10/1564319.html

  • 相关阅读:
    重大利好,Dubbo 3.0要来了。
    SaaS,PaaS,IaaS都是什么鬼?
    为什么Netty这么火?与Mina相比有什么优势?
    (21)python lambda表达式
    (19)python scrapy框架
    (18) python 爬虫实战
    (5)ASP.NET HTML服务器控件
    (17)python Beautiful Soup 4.6
    (4)ASP.NET内置对象1
    (16)网络爬虫
  • 原文地址:https://www.cnblogs.com/BluceLee/p/13825484.html
Copyright © 2011-2022 走看看