動作確認環境: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) }; }
- トップレベルステートメントです。
Create
内部ではラムダ式、switch
式、Target-typed newを使用しています。[MaybeNull]
属性は省略可能です(MaybeNull - Microsoft Docs)。- 条件が二択なら
switch
式よりも三項演算子(?:
)の方がよいかもしれません。ここでは拡張しやすさのために前者を採用しています。
追記(2021/3/15)
以前はTryCreate
と書いていましたが、Try
パターンの場合はbool
型の戻り値が相応しい気がしたので修正しました。