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

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

私訳:Disposeパターンの実装コードのコメント

やっぱ昨日も書いたとおり、Diposeパターンが良く分からないので、とりあえずMSDNのサンプルコードにくっついてるコメントを訳してみる。ほとんど極私的メモだけど、いちおう公開しておく。。。

// リソースは最初に初期化されてコンストラクタに渡されるが、
// コンストラクタ内で初期化されることもありうる。
// リソースの生存期間はこのインスタンスの生存期間を超えることはない
// この型はファイルハンドルやアンマネージドなメモリ空間などのネイティブリソースを
// 直接作成してはいないので、ファイナライザを必要としない。

public class DisposableResource : IDisposable
{

    private Stream _resource;  
    private bool _disposed;

    // コンストラクタに渡されるストリームは読み取り可能でnullではない必要がある
    public DisposableResource(Stream stream)
    {
        if (stream == null)
            throw new ArgumentNullException("Stream in null.");
        if (!stream.CanRead)
            throw new ArgumentException("Stream must be readable.");

        _resource = stream;

        _disposed = false;
    }

    // リソースを使用するメソッド。このメソッド呼び出し時にDispose済みであってはならない
    public void DoSomethingWithResource() {
        if (_disposed)
            throw new ObjectDisposedException("Resource was disposed.");

        // バイト数を表示する
        int numBytes = (int) _resource.Length;
        Console.WriteLine("Number of bytes: {0}", numBytes.ToString());
    }


    public void Dispose() 
    {
        Dispose(true);

	// この型のサブクラスがファイナライザを実装している場合はSupressFinalizeを使用する
        GC.SuppressFinalize(this);      
    }

    protected virtual void Dispose(bool disposing)
    {
 
	// スレッドセーフにする必要がある場合は、リソースを使用するメソッドと同様に、これらの操作をロックする必要がある
        if (!_disposed)
        {
            if (disposing) {
                if (_resource != null)
                    _resource.Dispose();
                    Console.WriteLine("Object disposed.");
            }

            // このインスタンスをDispose済みであるとマークする
            _resource = null;
            _disposed = true;   
        }
    }
}

どういう意味かはこれから考えるのだけど、とりあえずいい酒を買ったので呑んできます。
[rakuten:wine-days:10006891:detail]