C#繼承IDisposable釋放資源


public class CDisposable : IDisposable
    {
            //析構函數,編譯后變成 protected void Finalize(),GC會在回收對象前會調用調用該方法 
            ~CDisposable() 
            { 
                Dispose(false); 
            } 
  
            //通過實現該接口,客戶可以顯式地釋放對象,而不需要等待GC來釋放資源,據說那樣會降低效率 
            void IDisposable.Dispose() 
            { 
                Dispose(true); 
            } 
  
            //將釋放非托管資源設計成一個虛函數,提供在繼承類中釋放基類的資源的能力 
            protected virtual void ReleaseUnmanageResources() 
            { 
                //Do something... 
                Console.WriteLine("Do something... ");
            } 
  
            //私有函數用以釋放非托管資源 
            private void Dispose(bool disposing) 
            { 
                ReleaseUnmanageResources(); 
  
                //為true時表示是客戶顯式調用了釋放函數,需通知GC不要再調用對象的Finalize方法 
                //為false時肯定是GC調用了對象的Finalize方法,所以沒有必要再告訴GC你不要調用我的Finalize方法啦 
                if (disposing) 
                { 
                    GC.SuppressFinalize(this); 
                } 
            }  
 public static void ShowResults()
        {
            //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            int sms = Environment.TickCount;
            Console.WriteLine(sms.ToString());
            int i = 0;
            while (i < 100)
            {
                //tmpObj1沒有手工釋放資源,就等着GC來慢慢的釋放它吧 
                CDisposable tmpObj1 = new CDisposable();
                i++;
            }
            int mms = Environment.TickCount;
            Console.WriteLine(mms - sms);
            //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            i = 0;
            while (i < 100)
            {
                Console.Write("     ");
                //tmpObj2調用了Dispose方法,傳說比等着GC來釋放它效率要調一些 
                //個人認為是因為要逐個對象的查看其元數據,以確認是否實現了Dispose方法吧 
                //當然最重要的是我們可以自己確定釋放的時間以節省內存,優化程序運行效率 
                CDisposable tmpObj2 = new CDisposable();
                ((IDisposable)tmpObj2).Dispose();
                i++;
            }
            int ems = Environment.TickCount;
            Console.WriteLine(ems - mms);
            //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM