如何为位置记录定义额外的初始化逻辑?

Pav*_*nin 10 .net c# c#-9.0

我想验证用于记录初始化的参数,如果验证失败的话。对于常规类,我可以使用构造函数来实现,但是我应该如何处理记录呢?

对于常规类,我还可以拥有私有构造函数和公共静态工厂方法,它们返回错误或有效实例,但看起来无法将记录的主构造函数设为私有。

对于非位置记录,它与任何其他类一样:

public record Person
{
    public string FirstName {get; init;}
    public string LastName {get; init;}
    
    public Person (string firstName, string lastName)
    {
        (FirstName,LastName) = (firstName, lastName);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 8

添加到上面的注释中,您可以在使用工厂方法时通过使记录抽象并添加扩展它的私有嵌套类来隐藏主构造函数。

与具有私有构造函数的传统类不同,有人仍然可以扩展您的记录。但这确实可以防止消费者意外绕过工厂。

public abstract record Person(string FirstName, string LastName)
{
  public static Person Create(string FirstName, string LastName)
  {
    // ... validate arguments ...

    return new PersonImpl(FirstName, LastName);
  }

  private record PersonImpl(string FirstName, string LastName) 
    : Person(FirstName, LastName);
}
Run Code Online (Sandbox Code Playgroud)