在{}中创建对象参数?


15

我正在尝试从书中解码一段代码:

List<Person> people = new List<Person>()
{
new Person {FirstName="Homer",LastName="Simpson",Age=47},
new Person {FirstName="Marge",LastName="Simpson",Age=45}
};

Person只是他们制作的一个简单类,其中包含许多字段:名称,姓氏等。

我不明白的是,我们不是将参数发送到非花括号中的Person的构造函数吗?我尝试复制此代码,但似乎没有成功,有人吗?

感谢您的输入。



1
“我尝试复制此代码,但似乎没有成功” <-您需要使用C#3(VS 2008)或更高版本,此语法才可用。
AakashM

请注意两个概念之间的区别:对象初始化和对象填充。通常,您在构造函数中进行初始化。您的示例方法最好用于填充而不是初始化。
2012年

Answers:


27

初始化对象时,C#允许您使用大括号指定属性参数。这使您可以选择要初始化的项目以及将哪些保留为默认值。

另一方面,构造函数运行带有一组固定参数的单个代码块。因此,要获得相同的效果,您将必须创建多个构造函数,并且都具有可能要初始化的各种属性组合,这可能很乏味。

var x = new Person {FirstName="Homer",LastName="Simpson",Age=47}; 

与此完全相同:

var x = new Person();
x.FirstName="Homer";
x.LastName="Simpson";
x.Age=47;

除了它更短并且可以说在眼睛上更容易。

它还允许像您在问题中演示的那样构造,如果您必须像在此之前那样创建临时变量并将其初始化,然后将它们添加到列表中,这将非常繁琐。(这是您过去必须这样做的方式。)所有这些都不需要显式定义的构造函数,该构造函数可以获取所需的参数列表,该列表可能会或可能不会可用。

另外,请注意,尽管构造函数可以使用私有设置器初始化属性,但该技术(从提供的示例中可以明显看出)仅在您具有属性的公共设置器时才有效。还要注意,我的简化示例隐式地称为默认(无参数)构造函数,因此必须存在。


可能值得添加的是,因此,花括号中初始化的属性必须是可公开设置的。
Yam Marcovic

@YamMarcovic啊。是。注意添加到该效果。
tylerl 2012年

2
啊,我很高兴,很好的解释。
RealityDysfunction 2012年

2
要使用单个构造函数获得非常相似的效果,可以将其所有参数设为可选。然后,您可以执行类似的操作new Person(lastName: "Simpson"),而忽略firstNameage参数。
svick 2012年

这不能解决为什么不能将它们仅传递给构造函数的原因,即var x = new Person("Homer", "Simpson", 47);
rayray '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.