導入
「座標」「金額」「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です。