This question already has answers here:
Why are C# 3.0 object initializer constructor parentheses optional?

(5个答案)


7年前关闭。




通常我在将initialize添加到object时立即将list用这种方式--->
list.add(
   new foo() {                       //     <--- foo()
      field1 = value1,
      field2 = value2
   }
);

但是一旦我尝试了--->
list.add(
   new foo {                     //     <--- foo
      field1 = value1,
      field2 = value2
   }
);

& 有效 !!!

在第二种方式中,我只是creatingobject而没有在其尾部使用()
那么有人对这些初始化对象的各种方式之间的区别有任何想法吗?

最佳答案



完全没有区别。在这两种情况下,您都使用object initializer,并且如果您不指定任何构造函数参数,则完全等同于提供一个空的构造函数参数列表。根据C#规范的7.6.10.1节:



请注意,在不使用对象初始化程序(花括号)的情况下仅调用构造函数时,必须指定构造函数参数。所以:

Foo foo = new Foo();    // Valid
Foo foo = new Foo;      // Invalid
Foo foo = new Foo() {}; // Valid
Foo foo = new Foo {};   // Valid

“有效”行完全相同,包括对默认参数的任何使用-因此Foo可能仅具有以下构造函数:
// You can invoke this without specifying arguments
public Foo(int x = 0)
{
}

有关更多详细信息,请参见C#5规范的7.6.10节。

关于c# - C#中用这两种方式初始化对象之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17105618/

10-10 21:11