例如,我有一个不可变类型
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)
但是我不能.在这种情况下,有任何可能的方法来使用强大的对象初始化器语法吗?
最接近的是带有可选参数的构造函数:
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可能会获得具有更简单语法的不可变“记录类型”。这些可能会也可能不会进入最终版本,但听起来很酷。)