C#对象初始化器 - 是否包含构造函数的括号调用?

3

我是一名新的C#开发人员。

我有一个员工类。

使用和不使用()在声明对象时是否有区别?在Visual Studio中不会标记错误。例如:

Employee newEmployee = new Employee() { FirstName = "David", LastName = "HasselHoff", Email_ID ="dh@fdh.com" };

或者
Employee newEmployee = new Employee { FirstName = "David", LastName = "HasselHoff", Email_ID ="dh@fdh.com" };

4
没有,没有区别。这不是一个错误,所以VS不会将其标记为错误。 - Guru Stron
1
没有区别,只是可读性不同。我认为第一种变体稍微更易读,因为它提醒了调用无参构造函数。 - Robert Harvey
请注意,微软似乎倾向于在调用无参数构造函数时省略括号(您可以“混合和匹配”参数化构造函数和对象初始化)。 - Robert Harvey
1
new Employee() new Employee {}new Employee() {} 都是等价的。 - John Wu
4个回答

4

你所拥有的代码示例中没有任何区别,圆括号完全是可选的。

但是会有几种情况下产生差异:

首先,如果你的Employee类有一个非默认构造函数,你想要提供参数,你不能省略圆括号同时仍然传递参数给构造函数。

Employee newEmployee = new Employee(employeeId) { FirstName = "David", LastName = "HasselHoff", Email_ID ="dh@fdh.com" };

第二点:C#的下一个版本(9),其中类型定位已经得到改进,因此,如果您已经声明了要创建的类型,则不需要包含类名:

Employee newEmployee = new() { FirstName = "David", LastName = "HasselHoff", Email_ID ="dh@fdh.com" };

在这种情况下省略括号会让编译器认为你试图创建一个匿名类型。

2
括号和括号内的内容被称为构造函数。如果您的类不需要任何参数,可以不使用括号实例化对象。请查看this,它提供了多个实例化对象时带或不带括号的示例。

希望您喜欢C#。


@mjwills 已更新 - 谢谢。 - Neil L.

1
如果您没有向构造函数传递任何参数,则可以跳过开放和关闭括号。
您可以在此处阅读更多相关信息。
Cat cat = new Cat { Age = 10, Name = "Fluffy" };
Cat sameCat = new Cat("Fluffy"){ Age = 10 };

Cat 有重载的构造函数,因此您可以将 Name 作为参数传递。


1

这些是匿名对象初始化器。有两种情况:

  • 当必须在构造函数中传递某些内容时,必须使用()括号。
Employee newEmployee = new Employee("David") { LastName = "HasselHoff", Email_ID ="dh@fdh.com" };
  • 如果不需要在构造函数中传递任何内容,则可以选择使用 () 括号或不使用。
Employee newEmployee = new Employee { FirstName = "David", LastName = "HasselHoff", Email_ID ="dh@fdh.com" };
Employee newEmployee = new Employee() { FirstName = "David", LastName = "HasselHoff", Email_ID ="dh@fdh.com" };

这两个是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接