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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM