.NET Disposeが必要なオブジェクトを管理するクラスはDisposeを実装しよう


 

基本的に、Dispose()が実装されているクラスのインスタンスは、不要になったときにDispose()を呼び出す必要があります。

StreamReader reader = new StreamReader("example.txt");
reader.Dispose();

// using文を使用することでもDispose()を呼び出せる
using (StreamReader reader = new StreamReader("example.txt"))
{

}


クラス内部でDispose()が実装されているクラスのインスタンスを作成して保持する場合は、どこかでDispose()を呼び出す機会を作らないといけません。このクラスにもDispose()を実装しましょう。

public class ContainingClass : IDisposable
{
    private IDisposable disposableObject = new DisposableObject();

    private bool disposedValue;

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                disposableObject?.Dispose();
            }
                        
            disposedValue = true;
        }
    }
    
    public void Dispose()
    {
        Dispose(disposing: true);
        GC.SuppressFinalize(this);
    }
}


IDEを使えば、IDisposableを実装するときにテンプレートを作成してくれるので、if (disposing) 内で必要なDispose()を書くだけです。

今回のようにDispose()が実装されたクラスのみを使用する場合は、ファイナライザは実装する必要はありません。


インプラス株式会社

このブログの人気の投稿

技術メモ「503 Service Unavailable」

googleドライブの同期は、フォルダ選択ができました。

グーグルグループのメーリングリストの返信先が個人になってしまう