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
2007/01/14 12:17
【 主要クラス 】
メタデータの取得に用いられるクラスは、いくつかあります。これらは、アセンブリや型やメンバー ( フィールド、プロパティ、イベント、コンストラクタ、メソッド ) などに対応して用意されているので、わかりやすくなっています。

Assembly クラス (System.Reflection)
アセンブリを表します。

Module クラス (System.Reflection)
モジュールを表します。

Type クラス (System)
型を表します。型とはクラスとインターフェイスです。構造体,列挙型,デリゲートなどもクラスの一種であり、Typeクラスで表されます。

MemberInfo クラス (System.Reflection)
ク ラスのメンバ ( フィールド、プロパティ、コンストラクタ、メソッド、イベント ) を表します。このクラスは、FieldInfoクラス、PropertyInfoクラス、EventInfoクラス、 MethodBaseクラスの基本クラスです。また、Typeクラスの基本クラスでもあることに注意します。

FieldInfo クラス (System.Reflection)
フィールドを表します。

PropertyInfo クラス (System.Reflection)
プロパティを表します。

EventInfo クラス (System.Reflection)
イベントを表します。

MethodBase クラス (System.Reflection)
コンストラクタとメソッドを表します。このクラスは、ConstructorInfoクラス、MethodInfoクラスの基本クラスです。

ConstructorInfo クラス (System.Reflection)
コンストラクタを表します。

MethodInfo クラス (System.Reflection)
メソッドを表します。


それぞれの継承関係は以下のようになります。

□ System.Object
├─□ System.Reflection.Assembly
├─□ System.Reflection.Module
└─□ System.Reflection.MemberInfo
   ├─□ System.Type
   ├─□ System.Reflection.FieldInfo
   ├─□ System.Reflection.PropertyInfo
   ├─□ System.Reflection.EventInfo
   └─□ System.Reflection.MethodBase
       ├─□ System.Reflection.ConstructorInfo
       └─□ System.Reflection.MethodInfo



今回はここまでです。次回は、型情報の取得について解説します。