potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C# 9.0 複合型に加わったレコード

C#の複合型は構造体とクラスの2種類であり、C# 8までキーワードはclassstructだけでした。C# 9.0からはここにrecordキーワードが追加されました。recordの実体は特別扱いされるクラスです。

型の分類を表にすると以下のような状態かと思います。レコードは特別扱いされるクラスであり、クラスとレコードが参照型複合体の特殊化という扱いではありません。

複合型の分類

分類1 分類2 キーワード
クラス クラス class
クラス レコード record
構造体 構造体 struct

レコードは次の点で普通のクラスと異なります。

  • キーワードがrecord
  • メンバー関数としてEqualsGetHashCodeなどが自動で実装される。
  • record(T1 a, T2 b, ...);としてメンバー変数とコンストラクターを同時に実装できる。
  • record(T1 a, T2 b, ...) {...}として通常のクラスと同様にメンバー関数やメンバー変数を実装できる。
  • with {...}が適用できる。

補足 

record以外の特別扱いされる複合型として匿名型(C# 3以降)とタプル(C# 7以降)があります。匿名型はnew+オブジェクト初期化子(new {a=..., b=..., ...})形式で作成される特別なクラス、タプルはタプルリテラル(a, b, ...))形式で作成される特別な構造体ValueTupleです。どちらも特別なキーワード存在しません。