周全解讀C#編程中的析構函數用法。本站提示廣大學習愛好者:(周全解讀C#編程中的析構函數用法)文章只能為提供參考,不一定能成為您想要的結果。以下是周全解讀C#編程中的析構函數用法正文
析構函數用於析構類的實例。
備注
不克不及在構造中界說析構函數。只能對類應用析構函數。
一個類只能有一個析構函數。
沒法繼續或重載析構函數。
沒法挪用析構函數。它們是被主動挪用的。
析構函數既沒有潤飾符,也沒有參數。
例如,上面是類 Car 的析構函數的聲明:
class Car { ~Car() // destructor { // cleanup statements... } }
該析構函數隱式地對對象的基類挪用 Finalize。如許,後面的析構函數代碼被隱式地轉換為以下代碼:
protected override void Finalize() { try { // Cleanup statements... } finally { base.Finalize(); } }
這意味著對繼續鏈中的一切實例遞歸地挪用 Finalize 辦法(從派生水平最年夜的到派生水平最小的)。
留意
不該應用空析構函數。假如類包括析構函數,Finalize 隊列中則會創立一個項。挪用析構函數時,將挪用渣滓收受接管器來處置該隊列。假如析構函數為空,只會招致不用要的機能喪失。
法式員沒法掌握什麼時候挪用析構函數,由於這是由渣滓收受接管器決議的。渣滓收受接管器檢討能否存在運用法式不再應用的對象。假如渣滓收受接管器以為某個對象相符析構,則挪用析構函數(假如有)並收受接管用來存儲此對象的內存。法式加入時也會挪用析構函數。
可以經由過程挪用 Collect 強迫停止渣滓收受接管,但年夜多半情形下應防止如許做,由於如許會招致機能成績。
應用析構函數釋放資本
平日,與運轉時不停止渣滓收受接管的開辟說話比擬,C# 無需太多的內存治理。這是由於 .NET Framework 渣滓收受接管器會隱式地治理對象的內存分派和釋放。然則,當運用法式封裝窗口、文件和收集銜接這類非托管資本時,應該應用析構函數釋放這些資本。當對象相符析構時,渣滓收受接管器將運轉對象的 Finalize 辦法。
資本的顯式釋放
假如您的運用法式在應用昂貴的內部資本,我們還建議您供給一種在渣滓收受接管器釋放對象前顯式地釋放資本的方法。可經由過程完成來自 IDisposable 接口的 Dispose 辦法來完成這一點,該辦法為對象履行需要的清算。如許可年夜年夜進步運用法式的機能。即便有這類對資本的顯式掌握,析構函數也是一種掩護辦法,可用來在對 Dispose 辦法的挪用掉敗時清算資本。
上面的示例創立三個類,這三個類組成了一個繼續鏈。類 First 是基類,Second 是從 First 派生的,而 Third 是從 Second 派生的。這三個類都有析構函數。在 Main() 中,創立了派生水平最年夜的類的實例。留意:法式運轉時,這三個類的析構函數將主動被挪用,而且是依照從派生水平最年夜的到派生水平最小的順序挪用。
class First { ~First() { System.Diagnostics.Trace.WriteLine("First's destructor is called."); } } class Second : First { ~Second() { System.Diagnostics.Trace.WriteLine("Second's destructor is called."); } } class Third : Second { ~Third() { System.Diagnostics.Trace.WriteLine("Third's destructor is called."); } } class TestDestructors { static void Main() { Third t = new Third(); } }
輸入:
Third's destructor is called. Second's destructor is called. First's destructor is called.
析構函數與Dispose()辦法的差別
1. Dispose須要完成IDisposable接口。
2. Dispose由開辟人員代碼挪用,而析構函數由GC主動挪用。
3. Dispose辦法應釋放一切托管和非托管資本。而析構函數只應釋放非托管資本。由於析構函數由GC來斷定挪用,當GC斷定某個對象不再須要的時刻,則挪用其析構辦法,這時候候該對象中能夠還包括有其他有效的托管資本。
4. 經由過程體系GC頻仍的挪用析構辦法來釋放資本會下降體系機能,所以推舉顯示挪用Dispose辦法。
5. Dispose辦法開頭處加上代碼“GC.SuppressFinalize(this);”,即告知GC不須要再挪用該對象的析構辦法,不然,GC仍會在斷定該對象不再有效後挪用其析構辦法,固然法式不會失足,但影響體系機能。
6、析構函數 和 Dispose 釋放的資本應當雷同,如許即便類應用者在沒有挪用 Dispose 的情形下,資本也會在 Finalize 中獲得釋放。
7、Finalize 不該為 public。
8、有 Dispose 辦法存在時,應當挪用它,由於 Finalize 釋放資本平日是很慢的。