我想查询一些我偶尔在一些C#代码中看到的构造;但是,我不知道这个名字。如果这是重复,我道歉;但是,如果不知道自己的名字就很难搜索。
构造如下:
Person me = new Person(){ Name = "Aelphaeis" } ;
是否有指定字段/属性的特殊名称?
答案 0 :(得分:8)
这称为对象初始值设定项。例如,让我们有一个名为Customer
的类,其定义如下:
public class Customer
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
然后你可以实例化一个Customer
类型的对象,如下所示:
Customer customer = new Customer
{
ID = 0,
FirstName="firstName",
LastName="lastName",
Age = 20
};
简而言之,这是实例化对象的另一种方式。
当我们使用对象初始化程序时,幕后会发生什么?
调用Customer
的默认空构造函数:
Customer customer = new Customer();
然后属性的setter按照它们在对象初始化程序中编写的顺序被称为:
customer.ID = 0;
customer.FirstName = "firstName";
customer.LastName = "lastName";
customer.Age = 20;
此外,对象初始化程序附近的概念是集合初始值设定项。
而不是写这个:
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Add(4);
我们可以这样写:
List<int> numbers = new List<int>() { 1, 2, 3, 4 };
这比初始版本的定义更紧凑,我也会说更具表现力。在上面的示例中,我们使用了集合初始值设定项。
当我们使用集合初始化程序时,幕后会发生什么?
如果我们采用最后一个例子,就会发生这样的事情:
// Create the a new list
List<int> numbers = new List<int>();
// Add one element after the other, in the order they appear in the
// collection initializer, using the Add method.
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Add(4);
有关对象和集合初始值设定项的详细信息,请访问此link。
最后但同样重要的是,我想指出对象和集合初始化程序是在C#3.0中引入的。不幸的是,如果您必须在C#2.0的几天内编写应用程序,那么您就没有此功能。
答案 1 :(得分:2)
这称为对象初始化器。集合的类似模式称为Collection Initializer。
这是一个基本的例子:
var widgetA = new Widget
{
WidgetId = "1",
WidgetName = "My Widget"
};
您还可以在使用对象初始化时调用构造函数:
// a constructor that takes an id for a parameter
var widgetB = new Widget("1")
{
WidgetId = "1",
WidgetName = "My Widget"
};
还有集合初始化器(也可以与对象初始化器结合使用):
var widgetList = new List<Widget>
{
new Widget {WidgetId = "1", WidgetName = "A"},
new Widget {WidgetId = "2", WidgetName = "B"},
new Widget {WidgetId = "3", WidgetName = "C"},
};
您还可以嵌套对象或集合初始值设定项
var widget = new Widget
{
WidgetId = "1",
WidgetName = "My Widget",
ChildWidget = new Widget
{
WidgetId = "2",
WidgetName = "I'm a Child Widget"
}
};
此模式也可用于匿名对象:
var anonymousObject = new
{
Id = "1",
Name = "My Anonymous Object",
};
您可以通过多种方式滥用模式,但在某个时刻它可能会开始变得难以阅读。
需要注意的一件重要事情是,在调用对象构造函数之后进行对象分配。因此,通过对象初始化设置的任何值都不会在构造函数中可用。
进一步阅读:
答案 2 :(得分:2)
它被称为对象初始化器。您可以找到更多信息here
您可以对集合(集合初始化程序)
执行相同的操作List<Cat> cats = new List<Cat>
{
new Cat(){ Name = "Sylvester", Age=8 },
new Cat(){ Name = "Whiskers", Age=2 },
new Cat(){ Name = "Sasha", Age=14 }
};
就个人而言,我不喜欢它,原因有二,