レコード(C# 9以降)は、主にイミュータブルなデータキャリアとして機能し、値ベースの等価性を備えた型を簡潔に定義する方法です。コンストラクタ、等価性比較、ToStringなどのボイラープレートコードを自動生成し、DTO、ドメイン値、データモデリングに最適です。
レコード定義(位置パラメータ構文)
;
p1 = Person(, );
p1.Name;
Console.WriteLine(p1);
位置パラメータ構文 record Person(string Name, int Age) は、プロパティ、コンストラクタ、ToString、等価性比較、分解(deconstruction)をすべて生成し、通常のクラスで必要となるボイラープレートコードを排除します。
var a = new Person("Ann", 30);
var b = new Person("Ann", 30);
a == b; // TRUE — records compare by VALUE (all properties equal)
// (a regular class would be FALSE here — classes compare by reference)
クラスは参照IDで比較されるのに対し、レコードは値で比較されます。同じプロパティ値を持つ2つのレコードは等しいと判定されます。これはデータオブジェクトに必要な動作です。
public record Person(string Name, int Age); // properties are init-only (immutable)
var p1 = new Person("Ann", 30);
var p2 = p1 with { Age = 31 }; // `with` creates a COPY with some properties changed
// p1 unchanged (immutable); p2 = Person { Name = Ann, Age = 31 }
レコードはデフォルトでイミュータブルであり、with式は変更されたコピーを作成します(非破壊的変更)。イミュータブルなデータを扱う際に理想的です。
public record class Ref(int X); // a reference type (default) with value equality
public record struct Val(int X); // a VALUE type record (C# 10)
レコードはC#の重要な最新機能(C# 9以降)で、イミュータブルなデータ型の定義を簡潔で正確にします。そのため、最新のC#開発には理解が重要です。
主な利点は実際のニーズに対応しています。ボイラープレートコードの排除(1行の宣言からコンストラクタ、プロパティ、ToString、等価性、分解を自動生成し、通常のクラスで必要な大量のコードを不要にします)と、値ベースの等価性(同じプロパティを持つ2つのレコードは等しい。参照で比較するクラスとは異なります)を提供します。これはデータオブジェクト、DTO、ドメイン値に必要な動作です。
レコードはデフォルトでイミュータブルで、非破壊的変更(変更されたコピーを作成)のための洗練された**with式**を備えており、より安全で予測可能なコードを実現するイミュータブル関数型スタイルをサポートしています。
レコードの理解(簡潔な構文、値ベースの等価性、withによるイミュータビリティ、record struct)は、クリーンで最新のC#を書くために価値があります。DTO、APIモデル、値オブジェクト、イミュータブルな状態をモデル化するイディオマティックな方法であり、現在のコードベースで広く使用されています。
レコード(イミュータブルなデータと値セマンティクス)をいつ使用するか、またはクラス(ミュータブルなオブジェクトと豊富な動作を持つID)をいつ使用するかを理解することは、最新C#への習熟度を示します。
レコードはデータモデリングを劇的に簡素化し、正確な等価性とイミュータビリティを提供します。これらは以前は退屈でエラーが起きやすかった一般的なニーズです。そのため、レコードは頻繁に使用される重要な機能であり、最新でクリーンなC#コードの特徴となっています。