new()之后的括号是否存在名称?

时间:2014-07-07 14:15:02

标签: c#

我想查询一些我偶尔在一些C#代码中看到的构造;但是,我不知道这个名字。如果这是重复,我道歉;但是,如果不知道自己的名字就很难搜索。

构造如下:

Person me = new Person(){ Name = "Aelphaeis" } ;

是否有指定字段/属性的特殊名称?

3 个答案:

答案 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 }
};

就个人而言,我不喜欢它,原因有二,

  1. 如果在对象初始值设定项中抛出异常,则您没有确切的行号。我会将它用于简单的初始化,但不能用于某些复杂的初始化。
  2. 我发现它更难阅读(但这是个人偏好)