c# - 验证使用仅初始化 setter 初始化的 C# 对象

标签 c# initialization immutability c#-9.0

重新开放的免责声明
这个问题是关于 对象验证 不可变 对象 施工中使用 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/

相关文章:

C++:如何声明私有(private)成员对象

c++ - 检测成员变量的阴影

java - 为什么在不可变对象(immutable对象)中使用 getter 而不是公共(public)字段?

java - Lombok + jackson 不可变

c# - 不可变变量和不可变对象(immutable对象)

c# - 在 Xamarin.Forms 上加载图像时内存不足

c# - 将 Sharepoint 2007 解决方案转换为 2010

matlab - 创建 mxArray *没有*内存分配/初始化

c# - List<string> 对象 IndexOf 返回 -1。如何?

c# - asp.net gridview 不显示数据