解構函式不僅僅 是在C中用,其實在C#也是有這個的,寫法很簡單
~類名 (){}
先給範例程式碼吧,。我們先建立兩個項目--AssemblyLibrary(類庫)和ConsolTest(控制台)
AssemblyLibrary
public class DisposaClass //:IDisposable { public string a = "1111"; ~DisposaClass() { a = string.Empty; Console.WriteLine("Press enter to Destroy it"); }}
ConsolTest
static void Main(string[] args) { DisposaClass dis = new DisposaClass(); //dis.Dispose(); Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); System.GC.Collect(); System.Threading.Thread.Sleep(10000); Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); dis = null; Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); Console.Read(); }
System.GC.Collect()這個是清理記憶體的方法, GC.GetTotalMemory(false) 檢索當前認為要分配的位元組數
在代碼中,我還特意的 把對象置為null和讓進程休眠了下,理論上來說,對象dis應該是被徹底釋放完,那控制台是不是就列印出 :Press enter to Destroy it 呢?
很遺憾,沒有出現 Press enter to Destroy it 。這個很簡單,GC的調用時系統控制的,我們也只是能發出指令,希望他清理記憶體,而不能強制他清理記憶體。
對於 一些對象而已,只要能 protected override void Finalize 的,不需要 ~ 類名 ,來實現解構函式 ,你override Finalize 就可以了。
0:32 了 。就不給例子了~~~
如果你說,解構函式 是 系統調用的,我們希望手動的調用呢?如果你 希望如此,那麼就繼承 介面IDisposable 就可以 了
public class DisposaClass :IDisposable { public string a = "1111"; ~DisposaClass() { a = string.Empty; Console.WriteLine("Press enter to Destroy it"); } public void Dispose() { a = string.Empty; } }
IDisposable 和 ~類名,的組合可以對記憶體的清理有不錯的效果
Public class MyClass:IDisposable { private bool IsDisposed=false; public void Dispose() { Dispose(true); GC.SupressFinalize(this); } protected void Dispose(bool Diposing) { if(!IsDisposed) { if(Disposing) { //Clean Up managed resources } //Clean up unmanaged resources } IsDisposed=true; } ~MyClass() { Dispose(false); } }
我跟人很少用這樣做,雖然他可以有效控制記憶體,我 之前做PDA的時候,才用了下單例和這些~~因為記憶體實在是太小了。
儘管如此我們花費一些時間實現IDisposable介面,如果客戶不能合適地調用它們會怎樣?為此C#有一個酷的解決方案。‘using’代碼塊。它看起來像這樣:
using (MyClass objCls =new MyClass()) { }
這個也是我現在比較喜歡用的方式,不需要自己Dispose對象。 特別是在winfrom中寫自訂控制項,如果不Dispose很容易記憶體溢出。
這章真心的不給力,越是這些基礎的越難寫。