はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】イミュータブルクラスの作り方

はじめに

今回はイミュータブル(Immutable)クラスについて書いていきたいと思います。

ネットサーフィンをしていたところ以下の記事を見つけました。
www.c-sharpcorner.com

正直私自身理解が曖昧だったのですが、これを機に少し勉強してみたいと思いました。

もしかしたら間違った情報を書いているかもしれませんので、そこの点はご了承ください。

イミュータブルとは

イミュータブルとはオブジェクトの作成時以外にプロパティを変更することができないものを指します。

stringなんかがよく例として紹介されていたりしますね。
String クラス (System) | Microsoft Docs

作り方1

  1. ReadOnlyなプロパティを作成
  2. コンストラクタでプロパティを初期化
public class Monster
{
    // ① Readonlyなプロパティ
    public string Name { get; }
    public int HP { get; private set; }

    // ② publicなコンストラクター
    public Monster(string name, int hp)
    {
        Name = name;
        HP = hp;
    }
}


使うとき。

static void Main(string[] args)
{
    var monter = new Monster("Slime", 10);

    // OK
    Console.WriteLine(monter.HP);

    // エラー
    monter.HP = 20;
}

作り方2

  1. ReadOnlyなプロパティを作成
  2. プロパティを初期化するprivateなコンストラクタを定義
  3. インスタンスを生成する静的メソッドを作成
public class Monster
{
    // ① Readonlyなプロパティ
    public string Name { get; }
    public int HP { get; }

    // ② privateなコンストラクター
    private Monster(string name, int hp)
    {
        Name = name;
        HP = hp;
    }

    // ③ Static Method
    public static Monster Create(string name, int hp)
        => new Monster(name, hp);
}


使う側。

static void Main(string[] args)
{
    var monter = Monster.Create("slime", 10);

    // OK
    Console.WriteLine(monter.HP);

    // エラー
    monter.HP = 20;
}

さいごに

いつイミュータブルクラスを利用すべきかなんかも参照元の記事に書いてあるので、是非そちらも参照してみてください。
www.c-sharpcorner.com

ではまた。