问题描述
如果验证失败,我想验证用于记录初始化和通过的参数。对于常规类,我可以为此使用构造函数,但是应该如何使用记录呢?
对于常规类,我还可以使用私有构造函数和公共静态工厂方法,这些方法返回错误或有效实例,但是似乎无法将记录的主构造函数设为私有。
对于非位置记录,就像其他任何类一样:
public record Person
{
public string FirstName {get; init;}
public string LastName {get; init;}
public Person (string firstName,string lastName)
{
(FirstName,LastName) = (firstName,lastName);
}
}
解决方法
添加到上面的注释中,您可以在使用工厂方法时通过使记录抽象并添加扩展它的私有嵌套类来隐藏主构造函数。
与具有私有构造函数的传统类不同,有人仍然可以扩展您的记录。但这确实可以防止消费者意外绕过工厂。
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);
}