C#におけるclassとrecordの違い
C#では、class
とrecord
はいずれもデータを表現する型を定義するためのキーワードですが、それぞれ異なる特徴を持ちます。本資料では、class
とrecord
の違い、それぞれの特徴や使い分けについて解説します。
目次
1. class
の特徴
class
は、C#におけるオブジェクト指向プログラミングを実現するための基本的な型です。
主な特徴
- ミュータブルな設計が主流
- プロパティやフィールドの値を変更可能。
- 例: ゲームのキャラクターやアプリケーションの設定など。
- 参照型
- ヒープに配置され、変数にはインスタンスの参照が格納される。
- オブジェクトの同一性を重要視
- デフォルトでは、
Equals
メソッドや==
演算子は参照の同一性を比較。
- デフォルトでは、
- 柔軟な構造
- 継承、インターフェースの実装、多態性などのオブジェクト指向の要素をサポート。
コード例
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString() => $"{Name}, {Age} years old";
}
2. record
の特徴
record
は、C# 9.0で導入された型で、主にイミュータブルなデータを表現するために使用されます。
主な特徴
- イミュータブルな設計が主流
- 作成後にデータを変更しないことを前提に設計。
- プロパティは通常
init
アクセサーやreadonly
を使用。
- 値の同一性を重要視
Equals
メソッドや==
演算子で、オブジェクトの中身(プロパティの値)が同一かを比較。
- コピーの容易さ
with
式を使用して、新しいインスタンスを簡単に作成可能。
- デフォルトの
ToString
実装- プロパティの値を含む文字列を返す形式が自動生成される。
コード例
record Person(string Name, int Age);
var person1 = new Person("Alice", 30);
var person2 = person1 with { Age = 31 }; // Ageだけ変更した新しいインスタンス
イミュータブルなrecordの記述例
record
でプロパティを完全にイミュータブルに保つ場合には、init
アクセサーを使用します。
record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
var originalPerson = new Person { Name = "Alice", Age = 30 };
// originalPerson.Name = "Jhon"; // これはエラーになる
var updatedPerson = originalPerson with { Name = "Jhon" }; // 新しいインスタンスを作成
Console.WriteLine(updatedPerson.Name); // 出力: Jhon
3. class
とrecord
の比較
特徴 | class | record |
---|---|---|
基本目的 | オブジェクト指向 | データ表現 |
同一性の比較 | 参照の同一性 | 値の同一性 |
ミュータブル性 | ミュータブル(変更可能) | イミュータブル(変更不可が主流) |
デフォルトのToString | オーバーライドが必要 | 自動生成 |
コピーのサポート | 自力で実装 | with 式で簡単 |
主な用途 | 振る舞いやロジックを持つオブジェクト | データ転送やデータ保存 |
4. 使い分けの指針
class
を使う場面
- 状態や振る舞いを持つオブジェクトを作成したいとき。
- ミュータブルなオブジェクトが必要な場合。
- 継承やポリモーフィズムを多用する場合。
record
を使う場面
- イミュータブルなデータ構造が必要な場合。
- 比較が頻繁に行われるデータ(例: IDや属性での比較)。
- データ転送オブジェクト(DTO)や設定オブジェクトを定義する場合。
5. まとめ
class
は、オブジェクトの状態や振る舞いを重視する場合に適している。record
は、データの値や構造を重視する場合に適している。
これらの違いを理解し、適切に使い分けることで、効率的でメンテナンス性の高いコードを実現できます。
ディスカッション
コメント一覧
まだ、コメントがありません