重新开放的免责声明
这个问题是关于 对象验证 的 不可变 对象 施工中使用 C# 9 init-only setters (而不是使用带有详细 "boiler plate code" 的构造函数)。
C# 9 引入了一个使用对象初始化器语法初始化不可变对象(immutable对象)的选项,仅使用 init setter:
class Immutable
{
public string Name { get; init; }
public int Value { get; init; }
}
Immutable o = new Immutable { Name = "Value1", Value = 257 };
此外,它引入了一种很好的语法来创建对象的变异副本:var o1 = o with { Value = 65537 };
以前创建和初始化新的不可变对象(immutable对象)的唯一选择是使用带参数的构造函数。新选项更加自然和优雅,但是缺少构造函数初始化的一个重要特性:验证。使用构造函数,我可以确保永远不会创建状态无效的对象。可以将验证代码放入 init setter 中,但据我所知,没有办法提供对整个对象状态的一般验证。具体来说,在上面的示例中,我看不到任何方法可以保证
Name
属性将履行其契约(Contract)以具有非空值。由于无参数构造函数是使用对象初始化语法所必需的,因此可以创建一个未初始化的实例:var o = new Immutable();
在这种情况下,属性将获得默认值。问题[编辑]:在使用 init setter 初始化完成后,是否有任何方法可以验证不可变对象(immutable对象)状态?请记住,初始化语句中可能未指定属性分配,并且默认对象状态可能无效。
最佳答案
我终于在 Mads Torgersen's comment 中找到了关于验证的信息。在他关于 C# 9 的帖子下。他们正在研究在 C# 10 中引入这一点的选项。
关于c# - 验证使用仅初始化 setter 初始化的 C# 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65367052/