C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/01/14 14:23
以前 Dispose Finalizeパターン という記事で解説したDispose Finalizeパターンを実装するクラスの、テンプレートを作ってみました。

【 Download 】
以下のリンクをクリックするとDownloadページへ移動するので、移動先からダウンロードしてください。

DisposableClass.zip


【 インストール方法 】
Visual Studio ユーザー項目テンプレートフォルダ ( 通常は "マイ ドキュメント\Visual Studio 2005\Templates\ItemTemplates" ) の "Visual C#" フォルダに、ダウンロードしたファイル ( DisposableClass.zip ) を配置するだけです。

Visual Studio ユーザー項目テンプレートフォルダは、Visual Studio 2005 の [ ツール ] - [ オプション ] - [ プロジェクトおよびソリューション ] - [ 全般 ] - [ Visual Studio ユーザー項目テンプレートの場所 ] で設定されている場所です。


【 使用方法 】
DisposableClass.zipをインストールすると、C#のプロジェクトに「新しい項目の追加」を行う際に "Disposable クラス" というテンプレートが選択できるようになります。

新しい項目の追加は、以下の方法で行えます。
  • [ プロジェクト ] - [ 新しい項目の追加 ] を選択する
  • プロジェクトのコンテキストメニューで [ 追加 ] - [ 新しい項目の追加 ] を選択する
  • Ctrl + Shift + A を押す
このテンプレートを使用すれば、Dispose(bool)メソッド内にリソースの解放処理を追加するだけで、Dispose Finalizeパターンを実装したことになります。


【 使用例 】
ConsoleApplication1プロジェクト ( デフォルトの名前空間もConsoleApplication1 ) で、このテンプレートを使ってDisposableClass1.csを作成した場合、以下のようなコードファイルが作成されます。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class DisposableClass1 : IDisposable
    {
        public DisposableClass1()
        {
            this.InitializeDisposeFinalizePattern();
        }

        public void Method1()
        {
            this.ThrowExceptionIfDisposed();
            // Method1 の処理をこの位置に記述します。
        }

        #region Dispose Finalize パターン

        /// <summary>
        /// 既にDisposeメソッドが呼び出されているかどうかを表します。
        /// </summary>
        private bool disposed;

        /// <summary>
        /// ConsoleApplication1.DisposableClass1 によって使用されているすべてのリソースを解放します。
        /// </summary>
        public void Dispose()
        {
            GC.SuppressFinalize(this);
            this.Dispose(true);
        }

        /// <summary>
        /// ConsoleApplication1.DisposableClass1 クラスのインスタンスがGCに回収される時に呼び出されます。
        /// </summary>
        ~DisposableClass1()
        {
            this.Dispose(false);
        }

        /// <summary>
        /// ConsoleApplication1.DisposableClass1 によって使用されているアンマネージ リソースを解放し、オプションでマネージ リソースも解放します。
        /// </summary>
        /// <param name="disposing">マネージ リソースとアンマネージ リソースの両方を解放する場合は true。アンマネージ リソースだけを解放する場合は false。 </param>
        protected virtual void Dispose(bool disposing)
        {
            if (this.disposed)
            {
                return;
            }
            this.disposed = true;

            if (disposing)
            {
                // マネージ リソースの解放処理をこの位置に記述します。
            }
            // アンマネージ リソースの解放処理をこの位置に記述します。
        }

        /// <summary>
        /// 既にDisposeメソッドが呼び出されている場合、例外をスローします。
        /// </summary>
        /// <exception cref="System.ObjectDisposedException">既にDisposeメソッドが呼び出されています。</exception>
        protected void ThrowExceptionIfDisposed()
        {
            if (this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().FullName);
            }
        }

        /// <summary>
        /// Dispose Finalize パターンに必要な初期化処理を行います。
        /// </summary>
        private void InitializeDisposeFinalizePattern()
        {
            this.disposed = false;
        }

        #endregion
    }
}



【 参考 】
独自の項目テンプレートを作成するには?[VS 2005のみ] - @IT











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/79-e1ba548f