やまちゃん(エンジニア)
【C# 9.0】Record 型 を実際に使ってみた気づき
やまちゃん(エンジニア)
2024.08.29
IT技術
Record型を使ってみた気付き
C# 9.0 からRecord型というものが追加され、 実際に使用してみたところ、
”書き換え不可”という制約が良い方にも悪い方にも働いていると感じた。
レコード型の詳しい説明は自分が以前書いたブログを見てもらいたい。
【C# 9.0】Record 型 の使い方について
良い点は書き換え不可なので、当然インスタンスを生成したときから変わらないため、データの状態がわかりやすい。
しかし開発を進めると、データの一部を書き換えたいという要件がよく発生する。
書き換え不可なので新しくインスタンスを生成することになるのだが、
全てのプロパティを羅列するのが冗長になってしまう。
1// レコードでの宣言
2public record ItemRecord(int ItemId, string Name, int Value);
3
4var currentItemRecord = new ItemRecord(1, "回復薬", 5);
5
6// インスタンスの情報を渡すためにプロパティを羅列して冗長になる
7var afterItemRecord = new ItemRecord(currentItemRecord.ItemId, currentItemRecord.Name, currentItemRecord.Value - 1);
8
9// インスタンスが同一か
10Debug.Log(ReferenceEquals(currentItemRecord, afterItemRecord));
11// 新しく作ったインスタンスの値が変わっているか
12Debug.Log(afterItemRecord);
新しいインスタンスが生成され、値が変わっている
with式
そんな問題を解決するためにRecord型にはwith式というものが用意されている。
with式では、インスタンスをクローンして、指定したプロパティのみを変更するということが行われる。
新しいインスタンスを生成しているので、既存インスタンスを変更しているわけではないことに注意する必要がある。
1// レコードでの宣言
2public record ItemRecord(int ItemId, string Name, int Value);
3
4var currentItemRecord = new ItemRecord(1, "回復薬", 5);
5
6// with式で指定したプロパティを変更し、記載したプロパティ以外をコピーする
7var afterItemRecord = currentItemRecord with { Value = currentItemRecord.Value -1 };
8
9// インスタンスが同一か
10Debug.Log(ReferenceEquals(currentItemRecord, afterItemRecord));
11// 新しく作ったインスタンスの値が変わっているか
12Debug.Log(afterItemRecord);
with式を使わない時と同様に、新しいインスタンスが生成され、値が変わっていることが確認できる。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ