📖

C#基本まとめ~クラス(インスタンス・コンストラクタ・デストラクタ)編~

2022/12/11に公開

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

クラスを利用するには基本的にインスタンス(実態)の生成が必要になり、インスタンスの生成にはnew演算子を使用します。

new演算子でクラスのインスタンスを生成する際に実行されるのがNewメソッドで、このようにインスタンス生成時に自動的に実行されるメソッドの事をコンストラクタと言います。
コンストラクタでは主に初期化をおこないます。

// クラスの宣言
private class Data
{
    // コンストラクタは無くとも可
}

// newをしない場合、インスタンスは生成されない
Data wk1;  // wk1 == null

// Newした時点でインスタンスが生成される
wk1 = new Data();

// 宣言と同時にインスタンスを生成することも可能
Data wk2 = new Data();

また、クラスのインスタンス生成に引数を設定することも可能です。

// クラスの宣言
internal class Data
{
    /// <summary>
    /// 引数の無いコンストラクタ
    /// </summary>
    public Data()
    {
        // 初期化処理を記述
    }
    /// <summary>
    /// 引数ありのコンストラクタ
    /// </summary>
    /// <param name="value1"></param>
    /// <remarks>「 : this()」を付けることで引数の無いコンストラクタ実施</remarks>
    public Data(int value1) : this()
    {
    }
    /// <summary>
    /// 引数が異なる複数のコンストラクタを定義可能
    /// </summary>
    /// <param name="value1"></param>
    /// <param name="value2"></param>
    public Data(int value1, int value2) : this(value1)
    {
    }
}

Data wk1;
Data wk2;
Data wk3;

// 引数無しでインスタンス生成
wk1 = new Data();
// 引数付きでインスタンス生成
wk2 = new Data(1);
wk3 = new Data(1, 2);

デストラクタ

コンストラクタがクラスの生成じに実行されるのに対し、デストラクタはクラスのインスタンスが破棄(ガベージコレクションに回収)される時に実行されます。

デストラクタの宣言にはクラス名の前に「~」を付けたメソッドで実装します。

Disposeとデストラクタの違いはDisposeはUsing等で明示的に呼び出すのに対し、デストラクタはガベージコレクションで回収される時に実行されるという違いになります。
独自実装のクラスにDisposeを実装するにはIDisposableインターフェースを実装します。

// クラスの宣言
public class Data : IDisposable
{
    /// <summary>
    /// 引数の無いコンストラクタ
    /// </summary>
    public Data()
    {
    }

    /// <summary>開放処理が実施済みかのフラグ</summary>
    protected var _disposed = false;

    public new void Dispose()
    {
        Dispose(true);
    }
    protected virtual new void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
            }
        }
        _disposed = true;
    }

    /// <summary>
    /// デストラクタ
    /// </summary>
    ~Data()
    {
        base.Finalize();
        Dispose(false);
    }
}

前記したようにDisposeとデストラクタの大きな違いは明示的に呼び出せるか否かになってきます(デストラクタもGC.Collectで間接的に呼べなくもないですが)。
その為、C#で開放処理をする場合Disposeを使用するのが一般的でDisposeが実行されない場合を考慮する必要がある場合にデストラクタを実装します。

Discussion