bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. [C#] record 型を理解する — 値の等価性・with 式・class との違い

[C#] record 型を理解する — 値の等価性・with 式・class との違い

Apr 17, 2026 C# , .NET bucket-sort

C# の record は、主に不変(immutable)なデータ構造を簡潔に定義するための構文です。C# 9.0(.NET 5)で導入され、値の等価性を持ち、データの保持・比較・構造的な等価性を目的としたシナリオで活躍します。

基本構文

最もシンプルな record の定義は次のとおりです。

public record Person(string Name, int Age);

たったこの1行で次のことが自動で行われます。

  • Name と Age のプロパティを持つクラスを定義
  • コンストラクタを自動生成
  • ToString() / Equals() / GetHashCode() を自動実装
  • with キーワードによるコピー構文が使える
  • Deconstruct() メソッドを自動生成

値の等価性(Value Equality)

class では Equals() がデフォルトで参照比較になりますが、record はプロパティの中身で比較します。

var person1 = new Person("Alice", 30);
var person2 = new Person("Alice", 30);

Console.WriteLine(person1 == person2);        // True(中身が同じなので等価)
Console.WriteLine(ReferenceEquals(person1, person2)); // False(別インスタンス)

同じ値を持つ別インスタンスでも == が true になるのが record の大きな特徴です。

with 式(コピー&変更)

record には with 式があり、一部のプロパティだけ変えた新しいインスタンスを簡単に作れます。

var person1 = new Person("Alice", 30);
var person3 = person1 with { Age = 31 };

Console.WriteLine(person1); // Person { Name = Alice, Age = 30 }
Console.WriteLine(person3); // Person { Name = Alice, Age = 31 }

元のインスタンスは変更されません。イミュータブルなデータを安全に「更新」できます。

ToString() の自動実装

record は ToString() が自動でオーバーライドされ、プロパティ名と値をわかりやすく表示します。

var person = new Person("Alice", 30);
Console.WriteLine(person); // Person { Name = Alice, Age = 30 }

デバッグ時にも便利です。

分解(Deconstruct)

record は Deconstruct() を自動実装するため、タプルのように分解して受け取れます。

var person = new Person("Alice", 30);
var (name, age) = person;

Console.WriteLine(name); // Alice
Console.WriteLine(age);  // 30

class との違い

比較項目 class record
比較方法 参照比較 値比較(プロパティの中身)
with コピー構文 使えない 使える
ToString() 自動実装 なし あり
Deconstruct() 自動実装 なし あり
イミュータブル既定 なし(手動実装) あり(init only)

record struct(C# 10)

C# 10(.NET 6)では record struct も導入されました。クラスベースの record(参照型)と異なり、値型として動作します。

public record struct Point(int X, int Y);

こちらはスタック上に配置されるため、小さく頻繁に生成するデータに向いています。ただし、record struct はデフォルトでミュータブルである点に注意が必要です。

ミュータブルな record

record はデフォルトでイミュータブルですが、set を使うことでミュータブルにすることもできます。

public record MutablePerson(string Name)
{
    public int Age { get; set; }
}

ただし、この場合は class との差が薄れるため、通常は init のままイミュータブルで使うのが推奨されます。

主な用途

  • API レスポンスのデータモデル
  • DTO(Data Transfer Object)
  • 状態管理(Redux ライクなパターン)
  • コンパクトなデータクラスが欲しいとき

まとめ

C# の record は「データを持つためのクラス」を簡潔かつ安全に定義するための構文です。

  • class に比べて値の等価性・with 式・ToString() の自動実装が得られる
  • 「中身が同じなら等しい」としたい場面に最適
  • C# 10 からは値型の record struct も選択肢になる

タプルと組み合わせるとさらに表現力が上がります。詳しくは [C#] タプル(Tuples)を深掘りする を参照してください。

C# .NET Record
← [C#] タプル(Tuples)を深掘りする — 基本・推論変数名・等値比較・戻り値・破棄・パターンマッチング・分解 [C#] class のコンストラクタを深掘りする — 基本・チェーン・Expression-Bodied・out 変数・Primary Constructor →

Related Posts

  • [C#] sealed override — 仮想メンバーを「ここで確定」させる設計テクニック Apr 28, 2026
  • [C#] Mutable vs Immutable — オブジェクトを「変えられる」設計と「変えられない」設計 Apr 24, 2026
  • [C#] Finalizable & Disposable パターン実践 — Dispose パターンの完全形 May 13, 2026
  • [C#] Disposable Objects — IDisposable / Dispose() と using 構文 May 12, 2026

Table of Contents

  • 基本構文
  • 値の等価性(Value Equality)
  • with 式(コピー&変更)
  • ToString() の自動実装
  • 分解(Deconstruct)
  • class との違い
  • record struct(C# 10)
  • ミュータブルな record
  • 主な用途
  • まとめ

Recent Posts

  • [C#] Finalizable & Disposable パターン実践 — Dispose パターンの完全形 May 13, 2026
  • [C#] Disposable Objects — IDisposable / Dispose() と using 構文 May 12, 2026
  • [C#] Finalizable Objects — Finalize() の役割と使いどころ May 11, 2026
  • [C#] System.GC クラスを整理する — ガベージコレクションを制御するための API May 10, 2026
  • [C#] IComparable と IComparer — オブジェクトの順序比較と複数ソート戦略 May 9, 2026

Categories

  • C#63
  • .NET62
  • AWS27
  • Laravel16
  • Linux15
  • MySQL9
  • Apache8
  • PHP8
  • DynamoDB6
  • セキュリティ6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • C#
  • .NET
  • AWS
  • Laravel
  • PHP
  • セキュリティ
  • MySQL
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • パフォーマンス
  • DoS
  • Nginx
  • Windows
  • WordPress
  • メモリ管理
  • 監視
  • 設計
  • Amazon Linux 2023
  • Docker
  • IDisposable
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • オブジェクト指向
  • クラス設計
  • コレクション
  • デザインパターン
  • パターンマッチング
  • 継承
  • 認可
  • Aurora
  • Blade
  • Grafana
  • Hugo
  • InfluxDB
  • Policy
  • Record
  • SSG
  • インターフェース
  • エラーハンドリング
  • カプセル化
  • ガベージコレクション
  • モニタリング
  • 例外
Powered by Hugo & Explore Theme.