具有对象初始化器语法的不可变类型

use*_*020 6 c# properties

例如,我有一个不可变类型

class Contact
{
    // Read-only properties. 
    public string Name { get; }
    public string Address { get; }
}
Run Code Online (Sandbox Code Playgroud)

我希望我可以使用对象初始化程序语法来创建联系人

Contact a = new Contact { Name = "John", Address = "23 Tennis RD" };
Run Code Online (Sandbox Code Playgroud)

但是我不能.在这种情况下,有任何可能的方法来使用强大的对象初始化器语法吗?

Joe*_*ite 5

最接近的是带有可选参数的构造函数:

class Contact
{
    public string Name { get; }
    public string Address { get; }
    public Contact(string name = null, string address = null) {
        Name = name;
        Address = address;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以使用参数名称来调用它:

new Contact(
    name: "John",
    address: "23 Tennis RD"
)
Run Code Online (Sandbox Code Playgroud)

语法与对象初始化器略有不同,但可读性强。与IMO的区别是一件好事,因为构造函数参数倾向于暗示不可变的属性。而且您可以按任何顺序指定参数,也可以省略一些参数,因此它与对象初始化程序语法一样强大。

这确实需要一些额外的代码(定义构造函数,分配所有属性),因此它比对象初始化程序语法要花更多的精力。但不是太可怕,不可变对象的价值值得。

(就其价值而言,C#7可能会获得具有更简单语法的不可变“记录类型”。这些可能会也可能不会进入最终版本,但听起来很酷。)