C#學(xué)習(xí)筆記整理_深入剖析構(gòu)造函數(shù)、析構(gòu)函數(shù)
構(gòu)造函數(shù)、析構(gòu)函數(shù)
構(gòu)造函數(shù):
1.若沒提供任何構(gòu)造函數(shù),則系統(tǒng)會自動提供一個默認的構(gòu)造函數(shù),初始化所有成員為默認值(引用類型為空引用null,值類型為0,bool類型為false);
2.若提供了帶參數(shù)的構(gòu)造函數(shù),則系統(tǒng)不提供默認的構(gòu)造函數(shù);
3.構(gòu)造函數(shù)可重載:可提供多個不同版本的構(gòu)造函數(shù),依據(jù)參數(shù)的個數(shù)、類型來區(qū)分;
4.私有構(gòu)造函數(shù):則無法通過該構(gòu)造函數(shù)實例化該對象,可通過調(diào)用靜態(tài)函數(shù)來實例化;當僅用作某些靜態(tài)成員或?qū)傩缘娜萜鲿r,可定義私有構(gòu)造函數(shù)來防止被實例化;
一般的構(gòu)造函數(shù)都是實例構(gòu)造函數(shù),只要創(chuàng)建實例,就執(zhí)行構(gòu)造函數(shù);
靜態(tài)構(gòu)造函數(shù):
1.只能定義一個,最多運行一次,僅在第一次調(diào)用類的任何成員之前由.NET運行庫調(diào)用它,
2.它不能帶任何參數(shù)、無任何訪問修飾符,只能訪問類的靜態(tài)成員,無法訪問到類的實例成員;
3.如果類有一些靜態(tài)字段、屬性需要在第一次使用類之前從外部源中初始化,則使用靜態(tài)構(gòu)造函數(shù);
4.靜態(tài)構(gòu)造函數(shù)與無參數(shù)的實例構(gòu)造函數(shù)可以同時定義,何時執(zhí)行哪個構(gòu)造函數(shù)不會沖突;
在構(gòu)造函數(shù)中可以調(diào)用自身的其它構(gòu)造函數(shù):this(),或父類的構(gòu)造函數(shù):base(),可類似繼承的語法調(diào)用其它構(gòu)造函數(shù);
只讀字段readonly:和常量const類似,不能修改其值,但只讀字段用readonly聲明,可以未初始化,在構(gòu)造函數(shù)中對其初始化,之后不可更改其值;
匿名類型的實例化:var a = new{f1=“1ad”, f2=”34”, f3=5, f4=6};
構(gòu)造函數(shù):用于析構(gòu)類的實例
• 不能在結(jié)構(gòu)中定義析構(gòu)函數(shù)。只能對類使用析構(gòu)函數(shù)。
• 一個類只能有一個析構(gòu)函數(shù)。
• 無法繼承或重載析構(gòu)函數(shù)。
• 無法調(diào)用析構(gòu)函數(shù)。它們是被自動調(diào)用的。由垃圾回收器控制,如果垃圾回收器認為某個對象符合析構(gòu),則調(diào)用析構(gòu)函數(shù)(如果有)并回收用來存儲此對象的內(nèi)存。程序退出時也會調(diào)用析構(gòu)函數(shù)
• 析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù)
可以通過調(diào)用 Collect 強制進行垃圾回收,但大多數(shù)情況下應(yīng)避免這樣做,因為這樣會導(dǎo)致性能問題
C# 無需太多的內(nèi)存管理。這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內(nèi)存分配和釋放。但是,當應(yīng)用程序封裝窗口、文件和網(wǎng)絡(luò)連接這類非托管資源時,應(yīng)當使用析構(gòu)函數(shù)釋放這些資源。當對象符合析構(gòu)時,垃圾回收器將運行對象的 Finalize 方法。
如果您的應(yīng)用程序在使用昂貴的外部資源,我們還建議您提供一種在垃圾回收器釋放對象前顯式地釋放資源的方式。可通過實現(xiàn)來自 IDisposable 接口的 Dispose 方法來完成這一點,該方法為對象執(zhí)行必要的清理。這樣可大大提高應(yīng)用程序的性能。即使有這種對資源的顯式控制,析構(gòu)函數(shù)也是一種保護措施,可用來在對 Dispose 方法的調(diào)用失敗時清理資源
class Car
{
-Car()
{
// … …
}
}
該析構(gòu)函數(shù)隱式地對繼承鏈中的所有實例遞歸地調(diào)用調(diào)用 Finalize()方法
public class Bus
{
protected static readonly DateTime globalStartTime;
protected int RouteNumber { get; set; }
static Bus() //靜態(tài)構(gòu)造函數(shù)
{
globalStartTime = DateTime.Now;
Console.WriteLine("Static ctor sets global start time to {0}", globalStartTime.ToLongTimeString());
}
public Bus(int routeNum)
{
RouteNumber = routeNum;
Console.WriteLine("{0} is created.", RouteNumber);
}
public void Drive()
{
TimeSpan elapsedTime = DateTime.Now - globalStartTime;
Console.WriteLine("{0} is starting its route {1:N2} minutes after global start time {2}.",
this.RouteNumber,
elapsedTime.TotalMilliseconds,
globalStartTime.ToShortTimeString());
}
}
class TestBus
{
static void Main()
{
Bus bus = new Bus(71);
bus.Drive();
System.Threading.Thread.Sleep(25);
Bus bus2 = new Bus(72);
bus2.Drive();
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
Static ctor sets global start time to 10:04:08 AM
71 is created.
71 is starting its route 21.00 minutes after global start time 10:04 AM.
72 is created.
72 is starting its route 46.00 minutes after global start time 10:04 AM.
*/
以上就是小編為大家?guī)淼腃#學(xué)習(xí)筆記整理_深入剖析構(gòu)造函數(shù)、析構(gòu)函數(shù)的全部內(nèi)容了,希望對大家有所幫助,多多支持腳本之家~
相關(guān)文章
DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯
這篇文章主要介紹了DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯,需要的朋友可以參考下2014-08-08
BootStrap mvcpager分頁樣式(get請求,刷新頁面)
這篇文章主要介紹了BootStrap mvcpager分頁樣式(get請求,刷新頁面)的相關(guān)資料,通過引入相關(guān)文件,實現(xiàn)此功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08
C# string轉(zhuǎn)unicode字符的實現(xiàn)
本文主要介紹了C# string轉(zhuǎn)unicode字符的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
c# 自定義值類型一定不要忘了重寫Equals,否則性能和空間雙雙堪憂
這篇文章主要介紹了c# 自定義值類型一定不要忘了重寫Equals,幫助大家提高c# 程序的性能,感興趣的朋友可以了解下2020-08-08

