C#學(xué)習(xí)筆記整理_深入剖析構(gòu)造函數(shù)、析構(gòu)函數(shù)
構(gòu)造函數(shù)、析構(gòu)函數(shù)
構(gòu)造函數(shù):
1.若沒提供任何構(gòu)造函數(shù),則系統(tǒng)會自動(dòng)提供一個(gè)默認(rèn)的構(gòu)造函數(shù),初始化所有成員為默認(rèn)值(引用類型為空引用null,值類型為0,bool類型為false);
2.若提供了帶參數(shù)的構(gòu)造函數(shù),則系統(tǒng)不提供默認(rèn)的構(gòu)造函數(shù);
3.構(gòu)造函數(shù)可重載:可提供多個(gè)不同版本的構(gòu)造函數(shù),依據(jù)參數(shù)的個(gè)數(shù)、類型來區(qū)分;
4.私有構(gòu)造函數(shù):則無法通過該構(gòu)造函數(shù)實(shí)例化該對象,可通過調(diào)用靜態(tài)函數(shù)來實(shí)例化;當(dāng)僅用作某些靜態(tài)成員或?qū)傩缘娜萜鲿r(shí),可定義私有構(gòu)造函數(shù)來防止被實(shí)例化;
一般的構(gòu)造函數(shù)都是實(shí)例構(gòu)造函數(shù),只要?jiǎng)?chuàng)建實(shí)例,就執(zhí)行構(gòu)造函數(shù);
靜態(tài)構(gòu)造函數(shù):
1.只能定義一個(gè),最多運(yùn)行一次,僅在第一次調(diào)用類的任何成員之前由.NET運(yùn)行庫調(diào)用它,
2.它不能帶任何參數(shù)、無任何訪問修飾符,只能訪問類的靜態(tài)成員,無法訪問到類的實(shí)例成員;
3.如果類有一些靜態(tài)字段、屬性需要在第一次使用類之前從外部源中初始化,則使用靜態(tài)構(gòu)造函數(shù);
4.靜態(tài)構(gòu)造函數(shù)與無參數(shù)的實(shí)例構(gòu)造函數(shù)可以同時(shí)定義,何時(shí)執(zhí)行哪個(gè)構(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ù)中對其初始化,之后不可更改其值;
匿名類型的實(shí)例化:var a = new{f1=“1ad”, f2=”34”, f3=5, f4=6};
構(gòu)造函數(shù):用于析構(gòu)類的實(shí)例
• 不能在結(jié)構(gòu)中定義析構(gòu)函數(shù)。只能對類使用析構(gòu)函數(shù)。
• 一個(gè)類只能有一個(gè)析構(gòu)函數(shù)。
• 無法繼承或重載析構(gòu)函數(shù)。
• 無法調(diào)用析構(gòu)函數(shù)。它們是被自動(dòng)調(diào)用的。由垃圾回收器控制,如果垃圾回收器認(rèn)為某個(gè)對象符合析構(gòu),則調(diào)用析構(gòu)函數(shù)(如果有)并回收用來存儲此對象的內(nèi)存。程序退出時(shí)也會調(diào)用析構(gòu)函數(shù)
• 析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù)
可以通過調(diào)用 Collect 強(qiáng)制進(jìn)行垃圾回收,但大多數(shù)情況下應(yīng)避免這樣做,因?yàn)檫@樣會導(dǎo)致性能問題
C# 無需太多的內(nèi)存管理。這是因?yàn)?.NET Framework 垃圾回收器會隱式地管理對象的內(nèi)存分配和釋放。但是,當(dāng)應(yīng)用程序封裝窗口、文件和網(wǎng)絡(luò)連接這類非托管資源時(shí),應(yīng)當(dāng)使用析構(gòu)函數(shù)釋放這些資源。當(dāng)對象符合析構(gòu)時(shí),垃圾回收器將運(yùn)行對象的 Finalize 方法。
如果您的應(yīng)用程序在使用昂貴的外部資源,我們還建議您提供一種在垃圾回收器釋放對象前顯式地釋放資源的方式??赏ㄟ^實(shí)現(xiàn)來自 IDisposable 接口的 Dispose 方法來完成這一點(diǎn),該方法為對象執(zhí)行必要的清理。這樣可大大提高應(yīng)用程序的性能。即使有這種對資源的顯式控制,析構(gòu)函數(shù)也是一種保護(hù)措施,可用來在對 Dispose 方法的調(diào)用失敗時(shí)清理資源
class Car { -Car() { // … … } }
該析構(gòu)函數(shù)隱式地對繼承鏈中的所有實(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)文章
C#利用OpenCvSharp實(shí)現(xiàn)玉米粒計(jì)數(shù)
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCVSharp4實(shí)現(xiàn)玉米粒計(jì)數(shù),文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考下2023-11-11