読者です 読者をやめる 読者になる 読者になる

RAIIをC#でやるには?

c# c++

RAIIとは?

Resource Acquisition Is Initializationの略で、直訳すると"リソースの取得は初期時に"となります。

これはC++D言語で一般的なテクニックでリソースの取得と破棄を、変数のコンストラクタとデストラクタに関連付けて行うものです。

例えば、下記のように書いておくとスコープを抜けた時に自動でファイルをクローズしてくれるのでクローズし忘れを防いでくれます。

class MyFileStream {
    public:
        MyFileStream( str filenname )
        {
            Open( filename );
        }
    
        ~MyFileStream()
        {
            Close();
        }

        ... //OpenとかCloseの実装
};

C#ではどうする?

しかし、このテクニックはC#では使えません。その代わりになるのがIDisposerインターフェースとusing句です。

class MyFileStream : IDisposer{
    public MyFileStream( str filenname )
    {
        Open( filename );
    }
    
    public void Dispose()
    {
        Close();
    }

    ...//OpenとかCloseの実装
};

と書いておき、使用の際には、

using( MyFileStream mfs = new MyFileStream( "hoge.txt" ) )
{
    //処理
}

と書いておくことでRAIIと同様のことができます。ちょっと使いづらい。