今天復習了一下C#基礎知識,剛好看到了析構函數這里,有了進一步了解,記錄一下,與君共勉
~類名() { //一些要釋放的代碼 }
“~”做前綴,加類名就構成了析構函數。
我們不能自己調用析構函數,它是在.NET垃圾收集過程中調用的。我簡單測試了一些,在WinForm中簡單調用類,當窗口關閉時,會調用這個類的析構函數。
我用想用到析構函數,是因為在處理過程中,要根據實際情況,在不同時期釋放和建立新的對象。
按照MSDN上的話,如果你的代碼中包含需要及時清理的非托管資源,別把它留給析構函數處理,因為不能保證析構函數會很快運行(.NET垃圾收集我們應該控制不了吧)。我們可以把資源的清理代碼封裝在一個VOID類型的無參數方法中,一般叫做Dispose。
例如我寫的一個基類:
public class CSMOBasic { private bool disposed = false; public CSMOBasic() { #region 構造代碼 #endregion } #region 析構函數,和清理函數 /// <summary> /// 析構函數 /// </summary> ~CSMOBasic() { // Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposed == false) { if (disposing == true) { // //釋放非托管資源的代碼 } // //釋放托管資源的代碼 } disposed = true; } #endregion }
我們就可以在代碼中根據需要調用Dispose函數釋放非托管資源啦。
不過我沒搞清楚 什么算托管資源,什么是非托管資源。
因為我要用到TcpClient,這個要根據需要手工釋放,在概念上算不算 非托管資源???
我又寫了派生類,析構函數和Dispose函數如下寫法:
public class CSMOTest : CSMOBasic { private bool disposed = false; // public CSMOTest() { // disposed = false; } // #region 析構函數,和清理函數 ~CSMOTest() { Dispose(false); //當派生類被執行析構函數時,會自動調用基類析構函數 } new public void Dispose()//我是這么寫的,不知道對不對, { Dispose(true); GC.SuppressFinalize(this); // base.Dispose(); //這里要手工調用基類的Dispose函數,否則不會自動調用 } new protected virtual void Dispose(bool disposing) { if (disposed == false) { if (disposing == true) { //_strLine = "000"; ////釋放非托管資源的代碼 } //_strLine = "000"; //釋放托管資源的代碼 } disposed = true; } #endregion }
轉載:https://www.cnblogs.com/cangfriend/archive/2009/09/10/1564319.html
