C# 建構函式與解構函式
阿新 • • 發佈:2019-02-06
(1)建構函式
<1>除非是static,否則編譯器將會給每一個沒有建構函式的類指定一個預設的建構函式
<2>建構函式private時候,類不能被例項化
<3>派生類可以通過base來顯式的呼叫基類的建構函式,當無顯式呼叫時,編譯器會自動的呼叫基類的預設建構函式
<4>基類沒有預設建構函式,派生類必須顯式的呼叫base
<5>建構函式可以標記為 public,protected,private,internal,protected internal
<6>例項建構函式,靜態建構函式。初始化靜態類或者非靜態類中的靜態變數就必須定義靜態建構函式。
<7>私有建構函式
私有建構函式存在的意義是為了防止被例項化,當一個類不想被聲稱為靜態類,同時裡面都是靜態成員時候,可以使用靜態建構函式。示例:
<8>C#不提供複製建構函式,如果需要得自己編寫。
<9>靜態建構函式。
靜態建構函式自動呼叫,發生在建立第一個例項或者引用任何靜態成員之前。
(2)解構函式
<1>解構函式不能被繼承,樣式跟C++一樣
<2>解構函式時自動被呼叫,是通過垃圾回收機制
程式設計師無法控制何時呼叫解構函式,因為這是由垃圾回收器決定的。 垃圾回收器檢查是否存在應用程式不再使用的物件。 如果垃圾回收器認為某個物件符合析構,則呼叫解構函式(如果有)並回收用來儲存此物件的記憶體。 程式退出時也會呼叫解構函式。
<3>解構函式的隱式轉換
<1>除非是static,否則編譯器將會給每一個沒有建構函式的類指定一個預設的建構函式
<2>建構函式private時候,類不能被例項化
<3>派生類可以通過base來顯式的呼叫基類的建構函式,當無顯式呼叫時,編譯器會自動的呼叫基類的預設建構函式
<4>基類沒有預設建構函式,派生類必須顯式的呼叫base
<5>建構函式可以標記為 public,protected,private,internal,protected internal
<6>例項建構函式,靜態建構函式。初始化靜態類或者非靜態類中的靜態變數就必須定義靜態建構函式。
<7>私有建構函式
私有建構函式存在的意義是為了防止被例項化,當一個類不想被聲稱為靜態類,同時裡面都是靜態成員時候,可以使用靜態建構函式。示例:
public class Counter { private Counter() { } public static int currentCount; public static int IncrementCount() { return ++currentCount; } } class TestCounter { static void Main() { Counter.currentCount = 100; Counter.IncrementCount(); Console.WriteLine("New count: {0}", Counter.currentCount); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } }
<8>C#不提供複製建構函式,如果需要得自己編寫。
<9>靜態建構函式。
靜態建構函式自動呼叫,發生在建立第一個例項或者引用任何靜態成員之前。
(2)解構函式
<1>解構函式不能被繼承,樣式跟C++一樣
class Car
{
~Car() // destructor
{
// cleanup statements...
}
}
<2>解構函式時自動被呼叫,是通過垃圾回收機制
程式設計師無法控制何時呼叫解構函式,因為這是由垃圾回收器決定的。 垃圾回收器檢查是否存在應用程式不再使用的物件。 如果垃圾回收器認為某個物件符合析構,則呼叫解構函式(如果有)並回收用來儲存此物件的記憶體。 程式退出時也會呼叫解構函式。
<3>解構函式的隱式轉換
protected override void Finalize() { try { // Cleanup statements... } finally { base.Finalize(); } }
<10> 建構函式呼叫建構函式
建構函式可以使用 this 關鍵字呼叫同一物件中的另一建構函式。 和 base 一樣,this 可帶引數使用也可不帶引數使用,建構函式中的任何引數都可用作 this 的引數,或者用作表示式的一部分。 例如,可以使用 this 重寫前一示例中的第二個建構函式
public Employee(int weeklySalary, int numberOfWeeks) : this(weeklySalary * numberOfWeeks) { } public Employee(int annualSalary) { salary = annualSalary; }