構造函數、析構函數
構造函數:
1.若沒提供任何構造函數,則系統會自動提供一個默認的構造函數,初始化所有成員為默認值(引用類型為空引用null,值類型為0,bool類型為false);
2.若提供了帶參數的構造函數,則系統不提供默認的構造函數;
3.構造函數可重載:可提供多個不同版本的構造函數,依據參數的個數、類型來區分;
4.私有構造函數:則無法通過該構造函數實例化該對象,可通過調用靜態函數來實例化;當僅用作某些靜態成員或屬性的容器時,可定義私有構造函數來防止被實例化;
一般的構造函數都是實例構造函數,只要創建實例,就執行構造函數;
靜態構造函數:
1.只能定義一個,最多運行一次,僅在第一次調用類的任何成員之前由.NET運行庫調用它,
2.它不能帶任何參數、無任何訪問修飾符,只能訪問類的靜態成員,無法訪問到類的實例成員;
3.如果類有一些靜態字段、屬性需要在第一次使用類之前從外部源中初始化,則使用靜態構造函數;
4.靜態構造函數與無參數的實例構造函數可以同時定義,何時執行哪個構造函數不會沖突;
在構造函數中可以調用自身的其它構造函數:this(),或父類的構造函數:base(),可類似繼承的語法調用其它構造函數;
只讀字段readonly:和常量const類似,不能修改其值,但只讀字段用readonly聲明,可以未初始化,在構造函數中對其初始化,之后不可更改其值;
匿名類型的實例化:var a = new{f1=“1ad”, f2=”34”, f3=5, f4=6};
構造函數:用于析構類的實例
• 不能在結構中定義析構函數。只能對類使用析構函數。
• 一個類只能有一個析構函數。
• 無法繼承或重載析構函數。
• 無法調用析構函數。它們是被自動調用的。由垃圾回收器控制,如果垃圾回收器認為某個對象符合析構,則調用析構函數(如果有)并回收用來存儲此對象的內存。程序退出時也會調用析構函數
• 析構函數既沒有修飾符,也沒有參數
可以通過調用 Collect 強制進行垃圾回收,但大多數情況下應避免這樣做,因為這樣會導致性能問題
C# 無需太多的內存管理。這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內存分配和釋放。但是,當應用程序封裝窗口、文件和網絡連接這類非托管資源時,應當使用析構函數釋放這些資源。當對象符合析構時,垃圾回收器將運行對象的 Finalize 方法。
如果您的應用程序在使用昂貴的外部資源,我們還建議您提供一種在垃圾回收器釋放對象前顯式地釋放資源的方式??赏ㄟ^實現來自 IDisposable 接口的 Dispose 方法來完成這一點,該方法為對象執行必要的清理。這樣可大大提高應用程序的性能。即使有這種對資源的顯式控制,析構函數也是一種保護措施,可用來在對 Dispose 方法的調用失敗時清理資源
class Car{ -Car() { // … … }}
該析構函數隱式地對繼承鏈中的所有實例遞歸地調用調用 Finalize()方法
public class Bus { protected static readonly DateTime globalStartTime; protected int RouteNumber { get; set; } static Bus() //靜態構造函數 { 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. */
以上就是小編為大家帶來的C#學習筆記整理_深入剖析構造函數、析構函數的全部內容了,希望對大家有所幫助,多多支持武林網~
新聞熱點
疑難解答