デストラクタ | C#でExcelを読み込んで操作する方法を公開|C# Excel操作テクニック.NET

メソッドに貼り付けるだけで機能するソースコードを多数用意しています。

デストラクタ

コンストラクタとデストラクタ

クラスを作成する」のページにも記載しましたが、クラスを操作する際にUsingの使用を可能にするため、作成するクラスにはコンストラクタとDisposeを実装します。

コンストラクタとデストラクタの概要についてはこちらに記述しました。使い分け方や各メソッドの意味など確認したい方は一読ください。


#region "コンストラクタとデストラクタ"

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public ExcelManager()
        {
            xlApp = new Application();
        }

        /// <summary>
        /// 解放
        /// </summary>
        public void Dispose()
        {
            // ExcelManagerが使われなくなったときに破棄する資源
            ReleaseExcelComObject(EnumReleaseMode.App);

            // dispose判定フラグON
            isDispose = true;

            // Dispose()が明示的に呼ばれたときは、GCからFinalize()呼び出しをさせない。
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// デストラクタ
        /// </summary>
        ~ExcelManager()
        {
            // 呼出し側がDispose()してなかったらここでDispose
            if (isDispose == false)
            {
                Dispose();
            }
        }

#endregion

■ コンストラクタ(public [クラス名]())

public [クラス名]() { 処理 }  はコンストラクタといい、ほかのクラスでNew()を宣言したときに呼ばれる処理です。

コンストラクタの処理では、クラス変数で宣言したxlAppのインスタンスを生成します。

 

■ デストラクタ(~[クラス名]())

~[クラス名]() { 処理 } は、コンストラクタとは対象に、クラスが破棄されるときに実行される処理です。しかし、C#ではガベージコレクタが機能しているため、ほとんどのクラスで実装する必要はありません。

明示的に解放が必要なリソースや、.NET Frameworkで管理されていないアンマネージリソースを使用するときに実装することがあります。

 

■ Dispose

public void Dispose() { 処理 } は、クラスのインスタンスが破棄されるときに呼ばれる処理です。

デストラクタと混同してしまいがちですが、自動的に呼ばれる処理を記述するデストラクタに対して、Disposeは明示的に呼ぶ必要のある処理を記述します。

デストラクタはガベージコレクタが実行されたタイミングで呼ばれる処理のため実行されるタイミングが不明です。

通常はDisposeを実装して、ソースコード上では都度解放するようにしたほうが良いでしょう。

 

クラスの準備は以上で完了です。

あとはプロパティ・メソッドカテゴリーから、必要な処理を移植すれば、Excelの操作が可能になります。

デストラクタとコンストラクタの使い方

このページでは、コンストラクタとデストラクタ、そしてデストラクタと混同してしまいがちなDisposeについて説明します。

 

● Dispose

まず初めに、Disposeとデストラクタは違うものです。よく混同して説明が書かれたページを目にするので、ここで説明を記載しておきます。

Disposeは、解放するクラスの中で使用していたリソースの破棄をするために実行する処理です。

これだけ書くとデストラクタと同じような処理内容ですが、明確な違いは、Disposeは明示的に呼び出さないと処理をしてくれないということです。

このDisposeを用意しないといけない場面は、クラス内で使用するリソースに.NET Frameworkの管理下にないもの(COMオブジェクトなどのアンマネージドリソース)が含まれている場合です。

このサイトでいうとExcelオブジェクトがそれに該当するため、ExcelオブジェクトはかならずDisposeで解放してあげる必要があるのです。これを忘れると「exeを終了したのに、exeから呼び出していたExcelアプリケーションがタスクマネージャに残ってる!」なんてことがよく起こります。

<宣言方法>

  /// <summary>
  /// 解放
  /// </summary>
  public void Dispose()
  {
      // ExcelManagerが使われなくなったときに破棄する資源
      ReleaseExcelComObject(EnumReleaseMode.App);

      // dispose判定フラグON
      isDispose = true;

      // Dispose()が明示的に呼ばれたときは、GCからFinalize()呼び出しをさせない。
      GC.SuppressFinalize(this);
  }

 

● コンストラクタ

動的クラスのインスタンスが生成されるときに実行される処理で、『public [クラス名]()』で宣言されます。

コンストラクタについてはお馴染みの処理なので、ここでは省略します。

<宣言方法>

    /// <summary>
    /// コンストラクタ
    /// </summary>
    public ExcelManager()
    {
        xlApp = new Application();
    }

 

● デストラクタ

コンストラクタと正反対の処理をします。クラスのインスタンスが破棄されると実行される処理で、記述方法は『~ [クラス名]()』です。

Disposeとの違いは、Disposeは明示的に呼び出したタイミングで実行する処理なのに対し、デストラクタはガベージコレクタが回収に来たタイミングで実行される処理です。

使い分けは、Finalizeは.NET Frameworkの管理下にあるリソースの解放処理を実装し、Disposeは.NET Frameworkの管理下に無いリソースの解放処理をすることが多いです。

<宣言方法>

  /// <summary>
  /// デストラクタ
  /// </summary>
  ~ExcelManager()
  {
     // マネージドリソースの解放処理
  }