24

通常我用这种方式将它添加到 a 时会initialize立即 --->objectlist

list.add(
   new foo() {                       //     <--- foo()
      field1 = value1,
      field2 = value2 
   }
);

但是一旦我尝试过--->

list.add(
   new foo {                     //     <--- foo
      field1 = value1,
      field2 = value2 
   }
);

& 有效 !!!

在第二种方式中,我只是creating一个object没有使用()它的尾部。那么有没有人知道这些初始化对象的各种方法之间的区别?

4

4 回答 4

29

那么有没有人知道这些初始化对象的各种方法之间的区别?

根本没有区别。在这两种情况下,您都使用了一个对象初始化器,并且如果您没有指定任何构造函数参数,这完全等同于提供一个空的构造函数参数列表。从 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 节。

于 2013-06-14T09:46:43.247 回答
9

它们都是对象初始化器。没有区别。不过这是个好问题。我认为在幕后结果是一样的......编译器使用空构造函数创建对象并设置属性。

于 2013-06-14T09:47:29.793 回答
6

没有任何区别。在第二种形式的对象初始值设定项(无括号)中,默认使用无参数构造函数,但可以显式指定。如果你想将参数传递给构造函数,你必须使用第一种形式(显然有一些值)。

于 2013-06-14T09:47:23.973 回答
3

正如大部分解释的那样,两者没有区别。每当我们创建对象时,总是会创建不带任何参数的默认构造函数,它使用默认值(空/NULL)初始化对象的成员,这意味着将使用您的第二种方法。但是当我们在对象初始化时传递参数时,必须为匹配的定义定义构造函数,否则会导致语法错误。如果没有为匹配定义定义构造函数,则没有任何东西可以作为值传递或初始化对象成员。

于 2013-06-14T12:26:29.193 回答