提问者:小点点

.NET 6使记录中的属性为必需且非空的最佳方法是什么


我在寻找答案,但找不到明确的答案。是的,我知道类似的问题无处不在。我希望我能在这里得到答案。

假设我有一个具有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;
    }
}

如果最后一个选项是强制非空值的方法,那么我会问:

  1. 有了所有新的缩短语法,我们真的应该这样做吗
  2. 我什么时候应该使用缩短的记录方式?(我总是想验证必填字段是否有值,并在构造函数中进行验证)

共1个答案

匿名用户

我可能会选择经典的方法,在构造函数上强制执行它。当名字总是必需的时候,我真的看不到它的缺点