Records
C#9.0からの機能で,readonlyでもデータを変更しながらインスタンスを複製することができるようになる.
code:records.cs
class Point{
public readonly float X;
public readonly float Y;
public Point With(float x = this.X, float y = this.Y)
=> new Point(x, y);
}
var p = new Point(1, 2);
var q = p.With(y: 3);
レコード型
不変型に対するボイラープレートコードを削減できる.
型名の後にコンストラクタ引数を書くことをプライマリコンストラクタと呼ぶ.
code:record.cs
// こういうコードが山ほど書かれる
class Point {
public readonly float X;
public readonly float Y;
public Point(float x, float y) {
X = x;
Y = y;
}
bool Equals(Point other) => (X, Y) = (other.X, other.Y);
int GetHashCode() => ....
}
// recordで削減できる.
record Point(float X, float Y); // プライマリコンストラクタ
docs
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-9.0/records
asRagi.icon
コンストラクタのオーバーロードでValidationを書くとデフォルトのコンストラクタを実行後にValidationが走るのでちょっと気持ち悪い
コンストラクタとクラス自体とでのアクセス修飾子の共通が強制される