2013年3月29日 星期五

[C#] Garbage Collection (3)

C# : Garbage Collection ()

  
續前文,拜讀前輩文章後,提到我們須習慣將類別的Dispose方法定義為virtual,以便讓繼承此類別的子類別可以在他們的Dispose方法呼叫父類別的Dispose方法,確實做到回收父子類別用到的記憶體。

所以我們將上篇文章 [C#] Garbage Collection(2) CSampleClass Dispose方法宣告為virtual :

/// <summary>
/// Virtual Dispose
/// </summary>
public virtual void Dispose()
{
   DoDispseStep();
}



然後寫一個子類別 CChildClass,繼承CSampleClass
並在自己的Dispose方法中,呼叫父類別的Dispose方法: base.Dispose();

public class CChildClass : CSampleClass, IDisposable
{
        public Dictionary<String, String> Pets;
        private bool DisposedFlag = false;

        /// <summary>
        /// 建構
        /// </summary>
        public CChildClass()
        {
            Pets = new Dictionary<string, string>();
        }

        /// <summary>
        /// Dispose
        /// </summary>
        public  virtual void Dispose()
        {
            if (DisposedFlag == false)
            {
                Console.WriteLine("移除 Pets物件 {0} 筆資料", Pets.Count);
                Pets = null;

                //引用父類別的GC方法
                base.Dispose();

                DisposedFlag = true;
            }
        }
}


主程式就不寫了,當宣告一個CChildClass的物件後,並dispose他的時候,顯示以下訊息


移除 Pets物件 1 筆資料       → 源自CChildClassDispose方法
移除 ownedCar物件 2 筆資料   → 源自CSampleClassDispose方法





沒有留言:

張貼留言