C#, Python, Web開発

プログラミングやデータ分析のことなどを書いています。

C# record型の特徴(Immutable・不変)

C# の record で、個人的に気になった特徴の1つを書いていきます。

Immutable(不変)

インスタンスを生成すると、値が変えられないという特徴があります。

例えば、以下のレコードがあります。

public record Score(
  int Base,
  int Bonus,
  int Total
);

以下のコードはエラーになります。

var s1 = new Score(20, 5, 0);
s1.Total = s1.Base + s1.Bonus;

値を変えたいような場合(新しく作る)

レコードの値は変えられないので、状態を変えたい場合は新しいインスタンスを作ることになると思います。

var s1 = new Score(20, 5, 0);

var s2 = s1 with { Total = s1.Base + s1.Bonus };

Console.WriteLine(s2.Total);  // 25

上は with式を使った例です。

感想など

record は、get, set などを書かなくて良いので、すごく便利だと感じています。

ただ、ORM(Entity Framework など)を使う場合は、オブジェクトの値を更新する必要があると思います。そのため、Mutable な class を使いそうな気がしました。

あとは、with式で大量のインスタンスを作るのを避けたい場合もあると思います。状況に応じて、class と使い分けていくのが良さそうな気がしました。