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

Ash*_*ani 24 c# class object

一般情况下initialize,object当我list 用这种方式将它添加到一个时候即刻- >

list.add(
   new foo() {                       //     <--- foo()
      field1 = value1,
      field2 = value2 
   }
);
Run Code Online (Sandbox Code Playgroud)

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

list.add(
   new foo {                     //     <--- foo
      field1 = value1,
      field2 = value2 
   }
);
Run Code Online (Sandbox Code Playgroud)

& 有效 !!!

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

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)

"有效"行都是完全等效的,包括任何默认参数的使用 - 所以Foo可能只有这样的构造函数:

// You can invoke this without specifying arguments
public Foo(int x = 0)
{
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅C#5规范的7.6.10节.


ek_*_*_ny 9

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


Mar*_*ell 6

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