C# 構(gòu)造函數(shù)和析構(gòu)函數(shù)
在c#中定義類時(shí),常常不需要定義相關(guān)的構(gòu)造函數(shù)和析構(gòu)函數(shù),因?yàn)樵诰帉懘a時(shí),如果沒有提供它們,編譯器會(huì)自動(dòng)添加它們。但是,如有必要,可以提供自己的構(gòu)造函數(shù)和析構(gòu)函數(shù),以便初始化對(duì)象和清理對(duì)象。使用下述語法可以把一個(gè)簡(jiǎn)單的構(gòu)造函數(shù)添加到類中:
class MyClass
{
public MyClass()
{
// Constructor code.
}
}
這個(gè)構(gòu)造函數(shù)與包含它的類同名,且沒有參數(shù)(使其成為類的默認(rèn)構(gòu)造函數(shù)),這是一個(gè)公共函數(shù),所以類的對(duì)象可以使用這個(gè)構(gòu)造函數(shù)進(jìn)行實(shí)例化。
也可以使用私有的默認(rèn)構(gòu)造函數(shù),一般僅包含靜態(tài)成員的類會(huì)使用。即不能用這個(gè)構(gòu)造函數(shù)來創(chuàng)建這個(gè)類的對(duì)象實(shí)例:
class MyClass
{
private MyClass()
{
// Constructor code.
}
}
最后,通過提供參數(shù),也可以采用相同的方式給類添加非默認(rèn)的構(gòu)造函數(shù),例如:
class MyClass
{
public MyClass(}
{
// Default constructor code.
}
public MyClass (int myInt)
{
// Nondefault constructor code (uses raylnt).
}
}
可提供的構(gòu)造函數(shù)的數(shù)量不受限制(當(dāng)然不能耗盡內(nèi)存,也不能有相同的參數(shù)集,所以“幾乎不受限”更合適)。
使用略微不同的語法來聲明析構(gòu)函數(shù)。在.NET中使用的析構(gòu)函數(shù)(由System.Object類提供鄉(xiāng)為Finalize(),但這不是我們用于聲明析構(gòu)函數(shù)的名稱。使用下面的代碼,而不是重寫Finalize():
class MyClass
{
^MyClass()
{
// Destructor body.
}
}
類的析構(gòu)函數(shù)由帶有?前綴的類名來聲明(構(gòu)造函數(shù)也使用類名聲明)。當(dāng)進(jìn)行垃圾回收時(shí),就執(zhí)行析構(gòu)函數(shù)中的代碼,釋放資源。調(diào)用這個(gè)析構(gòu)函數(shù)后,還將隱式地調(diào)用基類的析構(gòu)函數(shù),包括System.Object根類中的Finalize()調(diào)用。該技術(shù)可以讓.NETFramework確保調(diào)用Finalize(),因?yàn)橹貙慒inalizeO則意味著需要顯式地執(zhí)行基類調(diào)用,這具有潛在危險(xiǎn)。
點(diǎn)擊加載更多評(píng)論>>