potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C# レコードにCreate静的メソッドを持たせる

動作確認環境:C# 9.0(.NET 5)

レコードは特殊なクラス(参照型の複合型)であり、クラス同様の静的メソッドを持つことができます。これを利用してインスタンスの作成を試行するCreate静的メソッドを実装できます。クラスの当たり前はレコードでも可能であること(クラスだから)を示す例です。

using System;
using System.Diagnostics.CodeAnalysis;

var record0 = TestRecord.Create(0, "x", 1.23); // null
var record1 = TestRecord.Create(123, "y", 0);  // record1
Console.WriteLine(record0 ?? record1);         // record1

record TestRecord(int x, string y, double z)
{
    [return: MaybeNull]
    public static TestRecord Create(int x, string y, double z)
        => x switch { 0 => null, _ => new(x, y, z) };
}

追記(2021/3/15)

以前はTryCreateと書いていましたが、Tryパターンの場合はbool型の戻り値が相応しい気がしたので修正しました。