トルネード

毛利のメモ書き

C#言語 IDisposableを使ってDispose()を実装

C#でinterfaceを作る

C#も他の言語と同様にinterfaceが作成できます。IDisposableを継承したinterfaceを作成し、Dispose()されるか試してみました。

IDisposableを継承したinterface

interface IHoge2: IDisposable
{
    void Foo();//=0は要らない。
    new void Dispose();//=0は要らない。
};

C++の場合純粋仮想関数ですが、C#はinterface型宣言なので、=0;は要らないようです。C#には名前付け方に規則があるようで、interfaceは頭文字を大文字I2文字目も大文字とする規則です。new void Dispose();メンバー関数が入っていますが、そもそもIDisposableinterfaceにDispose()宣言されているので、必要ありません。

IHoge2を継承したclassを作成する

作成したIHoge2を継承したclassを作成する。

class Class1:IHoge2
{
    public Class1(int i)
    {

    }
    public  void Foo()
    {

    }
    public void Dispose()
    {

    }

}

上記はIHoge2を継承したClass1の実装です。ここでは、IHoge2で宣言したメンバー関数void Foo()void Dispose()を実装しています。このClass1クラスをコールするコードを書いてみましょう。

private void Class_test()
{
    using (hoge1.IHoge2 c1 = new hoge1.Class1(0))
    {
        c1.Foo();
    }
}

ここでの変数を見て頂きたいのですが、変数宣言はhoge1.IHoge2 c1です。 しかし、実際のインスタンスを作成しているのはnew hoge1.Class1(0)。 interfaceは変数として利用できます。using (){}がありますが、このステートメントIDisposable継承したクラスで利用することができます。 using ステートメントは、ブロック内で例外が発生した場合でも必ず Dispose();がコールされます。

f:id:mojeld:20180721124619p:plain