可能重复:
What's the difference between an object initializer and a constructor?
在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 };
这种构造函数之间有什么不同?
答案 0 :(得分: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。
答案 1 :(得分:6)
差异可能是第二个不会编译。
您缺少一个默认构造函数,它在第二个示例中调用。
答案 2 :(得分: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.
...
因为变量的初始化发生时没有触及变量赋值。
答案 3 :(得分:1)
第二种形式
MyObject ob = new Object(){ val1 = 1, val2 = 2 };
是
的语法 MyObject ob = new Object();
ob.val1 = 1;
ob.val2 = 2;
关键是值的设置是不是构造函数的一部分。
答案 4 :(得分:1)
第一个是参数ctor
MyObject ob = new MyObject (1,2);
第二个是默认(零参数)ctor,但是一旦ctor完成,val1和val2就会被提供的值初始化
MyObject ob = new MyObject (){ val1 = 1, val2 = 2 };
另外,您可以使用大括号调用第二个。 E.g。
MyObject ob = new MyObject { val1 = 1, val2 = 2 };
答案 5 :(得分:1)
两者都不是一回事。
这是调用类构造函数:
MyObject ob = new Object(1,2);
这是一个内联对象初始化器:
MyObject ob = new Object(){ val1 = 1, val2 = 2 };
首先确保创建一个MyObject实例在构造时需要两个整数输入参数,而另一个实例只需在构造时间之后初始化一些字段或属性。最后一个保持自由,不一定要初始化这些属性和/或字段。