Dispose で資源を解放

Initial:AM  Name:Atsuko Maeda
Initial:AO  Name:Akihoto Okano
Initial:NS  Name:Nozomi Sasaki
Initial:SK  Name:Seisirou Katou
Initial:AU  Name:Aya Ueto

IDisposable を継承して、資源を解放します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. C言語では new で生成したリソースは delete で開放します。
    ところが .NET Framework では、ガベージ・コレクションの機能により、自動的に解放されます。
    便利である反面、不要になったリソースもガベージ・コレクタが起動するまで解放されません。
    それでは困るというニーズのために用意されたのが、IDisposable インターフェイスです。
  2. new で MyClass() を生成します。
    MyClass() は、イニシャルとフルネームを登録して、一覧を印字するクラスです。
    AddName() で "Seisirou Katou" と "Aya Ueto" を追加登録して Print() メソッドで印字します。
    不要になれば cls.Dispose(); で解放します。
    /*************************************/
    /*★ Dispose で解放する    前田 稔 ★*/
    /*************************************/
    using System;
    using System.Collections;
    
    class Prog
    {
        public static void Main()
        {
            MyClass cls = new MyClass();
            cls.AddName("SK", "Seisirou Katou");
            cls.AddName("AU", "Aya Ueto");
            cls.Print();
            cls.Dispose();
            // これ以降、MyClass() を使わない処理が続く
        }
    }
    
  3. IDisposable を継承した Class は、次のように書くと確実に Dispose() が呼び出されます。
    /*************************************/
    /*★ Dispose で解放する    前田 稔 ★*/
    /*************************************/
    using System;
    using System.Collections;
    
    class Prog
    {
        public static void Main()
        {
            using(MyClass   cls = new MyClass())
            {   cls.AddName("SK", "Seisirou Katou");
                cls.AddName("AU", "Aya Ueto");
                cls.Print();
            }
            // これ以降、MyClass() を使わない処理が続く
        }
    }
    
  4. イニシャルとフルネームを登録する MyClass() です。
    Dispose() 関数で資源を解放するので IDisposable を継承します。
    ArrayList を使ってイニシャルとフルネームを登録します。
    Constructor で最初に三人の名前を登録しています。
    リソースを解放する関数 Dispose() では、GC.SuppressFinalize(this); を呼び出して解放します。
    GC.SuppressFinalize(this)とすると、このオブジェクトのデストラクタは呼ばれなくなります。
    Destructor では Dispose() が呼ばれないで終了する場合に備えて、Dispose() を呼び出して下さい。
    AddName() は名前を追加登録するメソッドで、Print() は一覧を表示するメソッドです。
    //MyClass
    class  MyClass : IDisposable
    {
        ArrayList   array;
    
        //Constructor
        public MyClass()
        {
            array = new ArrayList();
            array.Add(new DataDef("AM", "Atsuko Maeda"));
            array.Add(new DataDef("AO", "Akihoto Okano"));
            array.Add(new DataDef("NS", "Nozomi Sasaki"));
        }
    
        //リソースを解放する関数
        public void  Dispose()
        {
            // GCによるメモリ回収時にFinalize()呼び出しをさせない。
            GC.SuppressFinalize(this);
        }
    
        //Destructor
        ~MyClass()
        {   // Dispose()が呼ばれないときはデストラクタから呼び出す
            Dispose();
        }
    
        //名前を追加登録する関数
        public void  AddName(string ini, string name)
        {   array.Add(new DataDef(ini, name));  }
    
        //登録されている名前一覧を表示する関数
        public void  Print()
        {   foreach(DataDef DAT in array)
                Console.WriteLine("Initial:{0}  Name:{1}", DAT.Initial, DAT.Name);
        }
    }
    
  5. ArrayList に登録する構造体(Class)を定義します。
    Initial がイニシャルを登録する領域で Name がフルネームを登録する領域です。
    ArrayList や string を使うと、配列の大きさや文字列長を気にすること無く作成できるので非常に便利です。
    //データ定義 Class
    class DataDef
    {   public string   Initial;
        public string   Name;
    
        //Constructor
        public DataDef(string ini, string name)
        {   Initial= ini;
            Name= name;
        }
    }
    

超初心者のプログラム入門(C# Frame Work)