C#之型別的建構函式和解構函式

是兩種特殊的方法。名稱固定的,建構函式必須和類名稱相同,解構函式名稱為“~”後跟型別的名稱。

建立一個物件的新例項通常伴隨著例項建構函式的自動呼叫。

值型別永遠在建立時就被例項化,所以它們不需要建構函式。

靜態類

Console類就是一個靜態類,當我們希望將一個類做成工具類,就可以考慮使用靜態類。

工具類會使用頻繁,如果非靜態每次使用都要在堆上分配空間,如果是靜態類,只需要分配一次空間,之後該類就永遠駐留在載入堆上,省空間又省時間。

static關鍵字只能用在類而不能用在結構。

型別中的靜態成員是全域性的,如果這個型別擁有多個例項,則共享其中的靜態成員,即一個例項更改了靜態變數的值,所有其他例項都會受到影響。靜態類和例項類的靜態成員駐留在載入堆中,不受GC控制。

靜態類中的所有方法必須都是靜態方法,所有成員必須都是靜態成員。

靜態類使用不需要建立新例項。

C#之型別的建構函式和解構函式

例項建構函式

引用型別的例項建構函式不能被繼承,不過可以透過base呼叫父類的建構函式。

對於靜態欄位,由靜態建構函式負責。因為在例項建構函式中為靜態成員賦值,之後更改這個值,再建立一個新例項時,值又被例項建構函式改回去了。通常只在靜態建構函式中為靜態成員賦值(因為它只會被執行一次)

型別沒有定義建構函式會生成一個無引數的例項建構函式。

可以宣告多個不同的建構函式,利用this關鍵字來呼叫其他建構函式。

class Program { static void Main(string[] args) { AClass a = new AClass(); Console。WriteLine(a。i); AClass b = new AClass(10); Console。WriteLine(b。i); Console。ReadKey(); // 靜態建構函式 // 有引數的建構函式 // 例項建構函式 // 5 // 有引數的建構函式 // 10 } } public class AClass { public int i; public static int j; static AClass() { j = 2; Console。WriteLine(“靜態建構函式”); } public AClass() : this(5) { Console。WriteLine(“例項建構函式”); } public AClass(int i) { this。i = i; Console。WriteLine(“有引數的建構函式”); } }

建立a時,呼叫無參的建構函式,但無參的建構函式呼叫了有參的建構函式,所以先執行有參的建構函式,將i設定為5,再執行無參的建構函式。建立b時,只調用了有參的建構函式。

建構函式的執行順序

如果有一個父類和繼承它的子類

執行靜態建構函式(先子類後父類),如果父類或子類的靜態建構函式已經執行過了,就不會再次執行。

執行例項建構函式(先父類後子類),如果有this,先呼叫this後面指向的例項建構函式的過載,再執行自己的。

如果父類的建構函式是私有的,子類建構函式無法透過編譯。子類的例項建構函式會呼叫父類的例項建構函式。

解構函式

會在物件被垃圾回收時執行,無需引數,無需返回值。

GC控制它的執行時間,所以我們不能直接呼叫它。