關於建構函式與解構函式的分享

Tulip123發表於2019-07-23

分享:建立複雜的類型別的物件時,可能需要對一些資料或者物件中需要使用的資源進行一些初始化操作,比如設定成員的預設值,開啟資料庫,開啟檔案,等等,而這些準備工作,就可以放在類的建構函式中進行。

與建構函式的功能相反的是解構函式,我們可以在解構函式裡面進行一些釋放和清理資源的操作。

一、定義

1、建構函式 :建構函式是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的一個類可以有多個建構函式 ,可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載

    • 建構函式必須與類同名;
    • 建構函式沒有返回型別,它可以帶引數,也可以不帶引數;
    •  一個類中可以有一個或多個建構函式,也就是說建構函式可以過載,從而提供初始化類物件的不同方法;
    • 宣告類物件時,系統自動呼叫建構函式,建構函式不能被顯式呼叫;
    • 若在宣告時未定義建構函式,系統會自動生成預設的建構函式,此時建構函式的函式體為空.
    • 靜態建構函式,用static修飾,用於初始化靜態變數,一個類只允許有一個靜態建構函式,在類例項化時載入,這時修飾符public、private失去作用.

2、解構函式:解構函式(destructor) 與建構函式相反,當物件結束其生命週期,如物件所在的函式已呼叫完畢時,系統自動執行解構函式。解構函式往往用來做“清理善後” 的工作(例如在建立物件時用new開闢了一片記憶體空間,delete會自動呼叫解構函式後釋放記憶體)

使用解構函式時,應該注意下面的問題:

    • 只能在類中使用解構函式,不能在結構中使用解構函式。
    • 一個類只能有一個解構函式。
    • 不能繼承或過載解構函式。
    • 解構函式只能被自動呼叫。
    • 解構函式沒有任何修飾符、沒有任何引數、也不返回任何值

 呼叫解構函式:

    • 垃圾回收器決定了解構函式的呼叫,我們無法控制何時呼叫解構函式。
    • 垃圾回收器檢查是否存在應用程式不再使用的物件。如果垃圾回收器認為某個物件符合析構,則呼叫解構函式(如果有)並回收用來儲存此物件的記憶體。
    • 程式退出時會呼叫解構函式。
    • 我們可以通過呼叫Collect強制進行垃圾回收,但是請不要這樣做,因為這樣做可能導致效能問題。

建構函式與解構函式的區別:
      建構函式和解構函式是在類體中說明的兩種特殊的成員函式。
      建構函式的功能是在建立物件時,使用給定的值來將物件初始化。
      解構函式的功能是用來釋放一個物件的。在物件刪除前,用它來做一些清理工作,它與建構函式的功能正好相反。

二、例子

  1、C#中規定,類的構造是與所在類同名的方法,而解構函式的方法名則是在建構函式名稱前面加上“~”符號。

  2、下面演示累的建構函式與解構函式的使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
    //演示建構函式
    public class CTest
    {
        //建構函式
        public CTest()
        {
            Console.WriteLine("在這裡初始化資源");
        }
        //解構函式
        ~CTest()
        {
            Console.WriteLine("在這裡清理或者釋放資源");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            CTest t = new CTest();
            t=null;
            GC.Collect();
            Console.ReadLine();
        }
    }
}

程式執行結果:

 


從執行結果來看,在使用new關鍵字建立一個類型別的物件時,會自動呼叫類的建構函式,而將物件設定為空引用(null)時,可以通過呼叫Collect強制進行垃圾回收。

debug和release區別:
  • 一個為除錯版本,其中包括了出錯時能夠定位原始碼的在行,如果原始檔已經改變,定位出來會有偏移,而且,在這個版本中編譯器不會進行程式碼優化,並且在程式中能用巨集定義_DEBUG來確定當前的版本。

  • 另一個為正試版本,程式出錯只是進行簡單的錯誤處理,編譯器會優化程式碼,以提高效能。

  • Release程式碼更小,執行更快,編譯更嚴格,更慢 。當然就沒有了除錯資訊。

   想詳細瞭解debug和release相關知識的可以到這裡學習:https://www.cnblogs.com/rgjycs/p/9254332.html

 

心得:所有的知識都需要一個過程,從你認識它,然後會使用它,再到理解它,最後消化了它。

ok,今天的分享就到這裡了,如果哪裡不對的地方請多包涵,謝謝指出。

相關文章