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

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

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

このページでは、コンストラクタとデストラクタ、そしてデストラクタと混同してしまいがちな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()
  {
     // マネージドリソースの解放処理
  }