C# 中的构造函数与初始化器的区别

7
在C#中,你可以像这样构造一个对象:

可能重复:
对象初始化程序和构造函数有什么区别?

在C#中,你可以像这样构造一个对象:

public class MyObject{

     int val1;
     int val2;

     public MyObject(int val1, val2){
           this.val1 = val1;
           this.val2 = val2;
     }
}

使用:

MyObject ob = new MyObject(1,2);

或者使用:
MyObject ob = new MyObject(){ val1 = 1, val2 = 2 };

这种构造函数有什么区别?

1
spanish by any chance :) - Tony The Lion
1
我之前问过同样的问题。https://dev59.com/W3RB5IYBdhLWcg3wCjgV 在那里除了这里的答案外还有更详细的信息。 - Pete
4
“new Object()”而不是“new MyObject()”的错误居然出现在每一个答案中,这真是令人惊讶。 - juharr
@juharr +1,好主意!我现在更新我的答案 :) - joe_coolish
6个回答

18
MyObject ob = new MyObject(){ val1 = 1, val2 = 2 };

只是一种语法糖(即简写方式)

MyObject ob = new MyObject();
ob.val1 = 1;
ob.val2 = 2;

两者之间的一个区别是,您可以从构造函数中设置readonly字段,但不能使用速记方式。

第二个区别是,具有参数的构造函数强制客户端提供这些值。请参阅Constructor-injection vs. Setter injection以获取良好的背景阅读材料。


请注意,这里可以省略括号。因此,MyObject ob = new Object(){ val1 = 1, val2 = 2 }; 可以写成 MyObject ob = new Object{ val1 = 1, val2 = 2 }; - Rob

6
差别可能在于第二个例子无法编译。你缺少一个默认构造函数,而它在第二个例子中被调用了。

+1,好的决定!默认构造函数需要被定义。 - joe_coolish
除了new Object之外,还有一个错误的new MyObject。 - Daniel Gomez Rico

4
MyObject ob = new Object(1,2);

这是构造对象并在构造函数中对值进行操作。它可能会设置这些值,也可能不会,具体取决于构造函数中的逻辑。
MyObject ob = new Object(){ val1 = 1, val2 = 2 };

这是使用默认构造函数构建对象,并在对象构建完成后设置属性初始值的过程。在此场景中,与构造函数相关的只有它与赋值操作位于同一语句中。其实这相当于:

MyObject ob = new Object();
ob.val1 = 1;
...

这种语法的优点在于,您可以执行以下操作:
 Object ob = new Object(){ val1 = 1, val2 = 2 };

不需要再进行以下操作:

Object ob = new Object(1,2);
((MyObject)ob).val1 = 1;  //note having to cast.
... 

因为变量的初始化是在不触及变量赋值的情况下进行的。


1

第二个表单

  MyObject ob = new Object(){ val1 = 1, val2 = 2 };

是用于的语法

  MyObject ob = new Object();
  ob.val1 = 1;
  ob.val2 = 2;

重点是值的设置不是构造函数的一部分。

1

两者并不是同一件事。

这是调用类构造函数:

MyObject ob = new Object(1,2);

这是一个内联对象初始化器:

MyObject ob = new Object(){ val1 = 1, val2 = 2 };

首先,确保在创建 MyObject 实例时需要两个整数输入参数来进行构建,而另一个则只是在构建后初始化一些字段或属性。最后一个则保持不一定必须初始化这些属性和/或字段的自由。


1

第一个是参数构造函数

MyObject ob = new MyObject (1,2);

第二个是默认(零参数)构造函数,但一旦构造函数完成,val1和val2将使用提供的值进行初始化。
MyObject ob = new MyObject (){ val1 = 1, val2 = 2 };

此外,您可以在不使用括号的情况下调用第二个函数。例如:

MyObject ob = new MyObject { val1 = 1, val2 = 2 };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接