C# 在c中使用这两种方法初始化对象的区别#

C# 在c中使用这两种方法初始化对象的区别#,c#,class,object,C#,Class,Object,通常,在将对象添加到列表时,我会立即初始化对象 这样--> list.add( 新的foo(){// list.add( 新foo{// 那么,有人知道初始化对象的各种方法之间的区别吗 没有任何区别。在这两种情况下,您都使用了,如果您没有指定任何构造函数参数,这完全等同于提供一个空的构造函数参数列表。从C#规范第7.6.10.1节: 如果对象创建表达式包含对象初始值设定项或集合初始值设定项,则可以省略构造函数参数列表和圆括号。省略构造函数参数列表和圆括号相当于指定空参数列表 请注意,如果只调用构

通常,在将对象添加到
列表时,我会立即初始化
对象
这样-->

list.add(
新的foo(){//

list.add(
新foo{//
那么,有人知道初始化对象的各种方法之间的区别吗

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

没有任何区别。在第二种形式的对象初始值设定项(无括号)中,默认情况下使用无参数构造函数,但可以显式指定。如果要将参数传递给构造函数,则必须使用第一种形式(显然带有一些值)它们都是对象的初始值设定项。没有区别。不过这是个好问题。我认为在幕后结果是一样的……编译器使用空构造函数创建对象并设置属性。

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

关于但如果Foo没有任何像u所说的
Foo(intx=0)这样的构造函数,该怎么办
.bcoz我的代码仍然有效,但没有constructor@AshokDamani:将应用默认值。它只是一个语法糖,就像您编写了空括号一样。由于
x
参数是可选参数,您可以调用
var f=new Foo()
(传入
0
)或
var f=new Foo(){}
(传入
0
)或
var f=new Foo{}
(传入
0
)或者您可以显式指定它:
var f=new Foo(9999){}
EDIT:是的,对于
struct
问题很抱歉,他们总是指定默认构造函数;我忽略了您声明
x
为可选参数。@AshokDamani:如果您不提供任何构造函数,那么C#编译器将为您提供一个无参数的构造函数,通常称为“默认构造函数”。
Foo foo = new Foo();    // Valid
Foo foo = new Foo;      // Invalid
Foo foo = new Foo() {}; // Valid
Foo foo = new Foo {};   // Valid
// You can invoke this without specifying arguments
public Foo(int x = 0)
{
}