C# 9.0 で導入された record
型は、不変オブジェクトや値の比較を簡潔に扱えるようにする新しい参照型です。従来の class
と似ているようで異なる性質を持ちます。本記事では record
と class
の違いや使いどころについて解説します。
record 型とは?
record
は参照型ですが、主に値ベースでの比較やイミュータブル(不変)データ構造を意識した設計になっています。
基本構文
public record Person(string FirstName, string LastName);
これは以下のような機能を自動的に持つクラスと同等です:
- プロパティの自動定義
- コンストラクタの生成
Equals()
やGetHashCode()
のオーバーライドToString()
の実装
class との違い
比較方法の違い
class
は参照の等価性(==)で比較されるrecord
は値の等価性で比較される(すべてのプロパティの値が同じか)
var p1 = new Person("Taro", "Yamada");
var p2 = new Person("Taro", "Yamada");
Console.WriteLine(p1 == p2); // record: true, class: false
不変性(イミュータブル)
record
はinit
アクセサを用いた不変プロパティ設計に適しているwith
式による簡易コピーが可能
var p1 = new Person("Taro", "Yamada");
var p2 = p1 with { FirstName = "Jiro" };
継承と階層構造
record
でも継承は可能ですが、データ主導な使い方が推奨されます
使い所の例
record が向いている場面
- DTO や API レスポンスなどのデータキャリア
- イミュータブルなモデル設計
- LINQ やコレクションの比較対象
class が適している場面
- 状態を持ち変化するオブジェクト(例:エンティティ)
- 振る舞い(メソッド)中心の設計
- パフォーマンスやメモリ最適化が重要な場面
まとめ
record
は C# における新しいデータ表現の手段として非常に強力です。特に値の等価性や不変性が重視されるシナリオにおいては、従来の class
よりもシンプルかつ安全にコードを書くことができます。
ただし、状態管理やビジネスロジックの中心となるようなオブジェクトには引き続き class
を使うべきです。状況に応じて使い分けることで、より明確で堅牢なコード設計が可能になります。