我在寻找答案,但找不到明确的答案。是的,我知道类似的问题无处不在。我希望我能在这里得到答案。
假设我有一个具有2个属性(FirstName, MiddleName)的Person
类。FirstName是必需的
我希望FirstName
属性始终具有不可为空的数据。
以下是我想到的一些选择(但似乎没有一个是完美的)。
一种可选的方法是使用记录的简短语法:
// FirstName might be null (bad)
// MiddleName is optional (good)
public record Person(string FirstName, string? MiddleName);
另一种方法是使用null原谅运算符,但仍然存在相同的问题。
// FirstName might be null (bad)
// MiddleName is optional (good)
public record Person
{
public string FirstName { get; init; } = null!;
public string? MiddleName { get; init; }
}
旧选项是检查构造函数中的输入:
// FirstName is required and will always have some data (good)
// MiddleName is optional (good)
// Long syntax (bad)
public record Person
{
public string FirstName { get; init; }
public string? MiddleName { get; init; }
public Person(string firstName, string? middleName)
{
// Probably it would be better to check if it is NullOrWhiteSpace.
ArgumentNullException.ThrowIfNull(firstName);
FirstName = firstName;
MiddleName = middleName;
}
}
如果最后一个选项是强制非空值的方法,那么我会问:
我可能会选择经典的方法,在构造函数上强制执行它。当名字总是必需的时候,我真的看不到它的缺点