2011-04-19 69 views
7

可能重复:
What's the difference between an object initializer and a constructor?构造与Initializors在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

西班牙语由任何机会:) – 2011-04-19 14:18:41

+1

前一段时间我问了这个非常相同的问题。 http://stackoverflow.com/questions/740658/whats-the-difference-between-an-object-initializer-and-a-constructor在这里查看除了答案之外的更深入的信息。 – Pete 2011-04-19 14:22:57

+4

令人惊讶的是,“新的对象()”而不是“新的MyObject()”的错误已经成为每一个答案。 – juharr 2011-04-19 14:27:44

回答

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了解一些背景知识。

+0

请注意,()可以省略在这里。所以MyObject ob = new Object(){val1 = 1,val2 = 2};可以是MyObject ob = new Object {val1 = 1,val2 = 2}; – Rob 2011-04-19 14:20:49

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; 

语法的关键点是,这些值的设定是构造的一部分。

7

区别可能是第二个不会编译。

您缺少默认的构造函数,它在第二个示例中调用它。

+0

+1好打电话!需要定义默认的ctor – 2011-04-19 14:22:23

+0

新对象旁边有一个新的MyObject错误 – Caipivara 2011-04-19 15:18:13

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 }; 
1

两者不是一回事。

这是调用类的构造:

MyObject ob = new Object(1,2); 

而这是直列对象初始化:

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

首先确保创建MyObject来的一个实例,需要在施工时间两个整型输入参数,而另一个,只是在施工时间之后初始化一些领域或属性。最后一个保留不一定初始化这些属性和/或领域的自由。