C# 基礎系列–類三(解構函式)

來源:互聯網
上載者:User

  解構函式不僅僅 是在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很容易記憶體溢出。

 

 

這章真心的不給力,越是這些基礎的越難寫。

 

 

 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.