C#中的构造函数和初始化器

时间:2011-04-19 14:17:46

标签: c# .net constructor

  

可能重复:
  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 };

这种构造函数之间有什么不同?

6 个答案:

答案 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实例在构造时需要两个整数输入参数,而另一个实例只需在构造时间之后初始化一些字段或属性。最后一个保持自由,不一定要初始化这些属性和/或字段。