2011-04-19 59 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來的一個實例,需要在施工時間兩個整型輸入參數,而另一個,只是在施工時間之後初始化一些領域或屬性。最後一個保留不一定初始化這些屬性和/或領域的自由。