本文へスキップ
BecomeCoder

C#オブジェクト指向コース · 第2章 型を表現する · レッスン13

record ― データの入れ物

ブラウザで完結

導入

「座標」「金額」「APIのレスポンス」のようなデータそのものを表すとき、classよりrecordが便利です。少ない記述で、値の比較や表示まで自動で用意してくれます。

図解

flowchart LR
    R["record Point(int X, int Y)"] --> A["自動生成"]
    A --> A1["コンストラクタ"]
    A --> A2["値の等価比較(==)"]
    A --> A3["読みやすい ToString"]
    style R fill:#e1f5fe

サンプル

// たった1行で「X, Y を持つデータ型」が定義できる
var p1 = new Point(3, 4);
Console.WriteLine(p1);            // Point { X = 3, Y = 4 }(ToString 自動生成)
Console.WriteLine(p1.X);         // 3

// 値が同じなら等しいと判定される(class と違う重要な特徴)
var p2 = new Point(3, 4);
Console.WriteLine(p1 == p2);     // True(別インスタンスでも値が同じなら等しい)

// with 式で「一部だけ変えたコピー」を作れる(元は不変)
var p3 = p1 with { Y = 99 };
Console.WriteLine(p3);           // Point { X = 3, Y = 99 }

record Point(int X, int Y);
  • record 名前(型 プロパティ, ...) で「データ型」を1行定義できる
  • 値が同じなら等しい==が値比較)——classは参照比較なのでここが大きな違い
  • with式で一部だけ変更したコピーを作れる(recordは基本的に不変)

演習

var user = new User("Taro", 20);
Console.WriteLine(user);   // User { Name = Taro, Age = 20 }

// TODO: Name(string) と Age(int) を持つ record User を1行で定義してください
___
  • 期待される出力: User { Name = Taro, Age = 20 }
ヒント1を見る

record User(string Name, int Age);

ヒント2を見る

使用コードの後ろにrecord User(string Name, int Age);を書きます

まとめ

  • recordはデータを表す型を簡潔に定義できる
  • 値が同じなら等しい(値の等価比較が自動)
  • with式で不変なコピーを作れる

次回: 軽量な値型structです。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。