C#の複合型は構造体とクラスの2種類であり、C# 8までキーワードはclass
とstruct
だけでした。C# 9.0からはここにrecord
キーワードが追加されました。record
の実体は特別扱いされるクラスです。
型の分類を表にすると以下のような状態かと思います。レコードは特別扱いされるクラスであり、クラスとレコードが参照型複合体の特殊化という扱いではありません。
複合型の分類
分類1 | 分類2 | キーワード |
---|---|---|
クラス | クラス | class |
クラス | レコード | record |
構造体 | 構造体 | struct |
レコードは次の点で普通のクラスと異なります。
- キーワードが
record
。 - メンバー関数として
Equals
やGetHashCode
などが自動で実装される。 record(T1 a, T2 b, ...);
としてメンバー変数とコンストラクターを同時に実装できる。record(T1 a, T2 b, ...) {...}
として通常のクラスと同様にメンバー関数やメンバー変数を実装できる。with {...}
が適用できる。
補足
record
以外の特別扱いされる複合型として匿名型(C# 3以降)とタプル(C# 7以降)があります。匿名型はnew
+オブジェクト初期化子(new {a=..., b=..., ...}
)形式で作成される特別なクラス、タプルはタプルリテラル((a, b, ...)
)形式で作成される特別な構造体ValueTuple
です。どちらも特別なキーワード存在しません。