やまちゃん(エンジニア)
【C# 9.0】Record 型 の使い方について
やまちゃん(エンジニア)
2024.06.18
IT技術
Record型とは
C# 9.0 からRecord型というものが追加された。
record 修飾子を使って、データをカプセル化するための組み込み機能を提供する参照型を定義します。
レコードにプライマリ コンストラクターを宣言すると、コンパイラにより、プライマリ コンストラクター パラメーター用のパブリック プロパティが生成されます。
参照型で定義され、インスタンス生成時に値を決定し、以降は読み取りのみ、書き換えは基本的には行うことができない様になっている。
使用用途としては、アイテムデータやキャラクターパラメータなど、値を変更しないデータ一覧を用意するときに使うのが適している。
Record型の使い方
記述方法は以下のようになる。
1// プライマリ コンストラクターでの宣言
2public record Item(int ItemId, string Name, int Value);
3
4// 以下の宣言と同義
5public class Item
6{
7 public int ItemId { get; init; }
8 public string Name { get; init; }
9 public int Value { get; init; }
10
11 public Item(int itemId, string name, int value)
12 {
13 ItemId = itemId;
14 Name = name;
15 Value = value;
16 }
17}
さらに、EqualsやToString()なども自動生成してくれる。
Record型は、オブジェクトを実装するたび書く必要があった似た内容のコンストラクタやEquals、ToString()などを省略できるようになっている。
1// プライマリ コンストラクターでの宣言
2public record Item(int ItemId, string Name, int Value);
3
4// 以下の宣言と同義
5public class Item
6{
7 public int ItemId { get; init; }
8 public string Name { get; init; }
9 public int Value { get; init; }
10
11 public Item(int itemId, string name, int value)
12 {
13 ItemId = itemId;
14 Name = name;
15 Value = value;
16 }
17
18 public bool Equals(Item? other)
19 => other is {} item &&
20 ItemId == item.ItemId &&
21 Name == item.Name &&
22 Value == item.Value;
23
24 public override bool Equals(object? obj)
25 => obj is Item item &&
26 ItemId == item.ItemId &&
27 Name == item.Name &&
28 Value == item.Value;
29
30 public override string ToString()
31 => $"Item { ItemId = {ItemId}, Name = {Name}, Value = {Value} }";
32}
また、classをToStringした場合は名称が出力されるだけだったが、recordではプロパティと値を列挙するようにToStringをoverrideしてくれる。
1// クラスでの宣言
2public class ItemClass
3{
4 public int ItemId { get; init; }
5 public string Name { get; init; }
6 public int Value { get; init; }
7
8 public Item(int itemId, string name, int value)
9 {
10 ItemId = itemId;
11 Name = name;
12 Value = value;
13 }
14}
15
16// レコードでの宣言
17public record ItemRecord(int ItemId, string Name, int Value);
18
19// 以下実際使用時の例
20var itemClass = new ItemClass(1, "回復薬", 5);
21Console.WriteLine(itemClass.ToString());
22// ItemClass
23
24var itemRecord = new ItemRecord(1, "回復薬", 5);
25Console.WriteLine(itemRecord.ToString());
26// ItemRecord { ItemId = 1, Name = 回復役, Value = 5 }
Record型の派生形
前述では参照型での定義と説明したが、C# 10.0 からは値型での定義も可能となっている。
読み取りのみでの使用を想定されていたRecordが、こちらの定義の仕方だと値への書き込みができるため、より柔軟に対応できるだろう。
1public record class Item(int ItemId, string Name, int Value);
2// public record Item と書いたのと同じ
3// インスタンス生成時のみ値を代入できる。以降読み取りのみ。
4// public int ItemId{ get; init; }
5// ...
6
7public record struct Item(int ItemId, string Name, int Value);
8// いつでも書き込み、読み取りができる。
9// public int ItemId { get; set; }
10// ...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ