在c#中使用这两种方式初始化对象之间的区别

时间:2013-06-14 09:43:59

标签: c# class object

initialize添加到object时,通常会list list.add( new foo() { // <--- foo() field1 = value1, field2 = value2 } ); 用这种方式---&gt;

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

但是我刚试过---&gt;

creating

&安培;它工作!!!

在第二种方式中我只是object ()而没有在其尾部使用{{1}}。 那么有没有人知道这些初始化对象的各种方法之间的区别呢?

4 个答案:

答案 0 :(得分:29)

  

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

完全没有区别。在这两种情况下,您使用的是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节。

答案 1 :(得分:9)

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

答案 2 :(得分:6)

无论如何都没有区别。在 second 形式的对象初始值设定项中(没有括号),默认情况下使用无参数构造函数,但可以显式指定。如果要将参数传递给构造函数,则必须使用第一个表单(显然有一些值)。

答案 3 :(得分:3)

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