5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C#のコンストラクタは完全コンストラクタパターンを検討しよう

Posted at

コンストラクタとは,インスタンスが生成されるときに
一番最初に動作する部分の事です。

例えばMeasureValueというクラスを作成し
コンストラクタを作成するとこのようになります。

public class MeasureValue
{
    public MeasureValue()
    {

    }
}

publicの後にクラス名をかかれたものは
コンストラクタになります。

外部からはこのように呼び出されます。

MeasureValue measureValue = new MeasureValue();

newを実行したときに引数無しのコンストラクタが起動し
その中に今回は何も書いていないので,特に何も起こりませんが
ブレイクポイントなどを置くとちゃんと通っていることが
確認できると思います。

ではこのコンストラクタ,いったい何のために必要なのでしょうか?

それは,インスタンスを生成するときに
クラスの変数などの初期化などが行えます。

例えばMeasureValueクラスに変数を追加します。

public class MeasureValue
{
    private int _value;
    public MeasureValue()
    {
        _value = 1;
    }
}

intの変数の_valueを追加し,コンストラクタで1を設定しました。
これでインスタンスが生成されるときに_valueに1が入ります。

「そんなのprivate int _value = 1; って書けばいいじゃん!」

ごもっともです。
次のように書いても同じ意味になります。

public class MeasureValue
{
    private int _value = 1;
    public MeasureValue()
    {
        _value = 1;
    }
}

だた,次のようなパターンではコンストラクタが
強力な意味を持ちます。

public class MeasureValue
{
    private int _value;
    public MeasureValue(int value)
    {
        _value = value;
    }
}

private void button7_Click(object sender, EventArgs e)
{
    MeasureValue measureValue = new MeasureValue(2);
}

この例ではコンストラクタにintの引数を持ち
_valueに代入しています。

これで,呼び出し元が値を自由に設定できるようになります。

さらにprivate int _value;をreadonlyにすることで
明示的にコンストラクタでの変更しかできない
変数を作ることができます。

public class MeasureValue
{
    private readonly int _value;
    public MeasureValue(int value)
    {
        _value = value;
    }
}

こういったコンストラクタで内部変数の値がすべて決まり,
その後一切変更できない実装を「完全コンストラクタパターン」といいます。

このように実装すると,インスタンスが生成されてから
一切値が変わらないので,可読性や保守性の高い
より良いコードとなります。

5
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?