IDisposable の実装

なにやら気をつける事があるようなので自分用テンプレート。
以下ソースコード

using System;

namespace Samples
{
    // 参考: http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpgenref/html/cpconfinalizedispose.asp
    class Disposable : IDisposable
    {
        public bool IsDisposed { get; private set; }

        protected Disposable()
        {
            IsDisposed = false;
        }

        public void Dispose()
        {
            Dispose(true);
            // Finalizer が呼ばれないようにする。
            GC.SuppressFinalize(this);
        }

        ~Disposable()
        {
            Dispose(false);
        }

        protected virtual void Dispose(bool disposing)
        {
            // Dispose() 内では Exception を発生させない設計にするべき。
            // Dispose() が何度も呼ばれる場合でも例外を発生させない。

            if (!IsDisposed) // 初回以外は何もしない
            {
                // IsDisposed = true; 呼び出された時点ですぐに true にするべきか?
                if (disposing) // Dispose() から呼ばれた場合
                {
                    // マネージドリソースを解放 (例: stream.Close())
                }

                // アンマネージドリソースを解放 (例: CloseHandle(IntPtr))
                // null を設定 (例: stream = null)

                IsDisposed = true;

                // 継承クラスはここで base.Dispose(disposing) する。
                // try catch finally { base.Dispose(disposing); } とか。
            }
        }
    }
}