2010-05-05 52 views
4

問題是關於結構。當我聲明一個結構類型變量/對象(不知道哪一個適合更好)或者一個數組或結構列表時,我是否必須像構造函數一樣顯式調用構造函數,或者只需聲明變量就足夠了?對於結構體,我必須在C#中顯式調用構造函數嗎?

+0

不確定您是否也在問您是否需要新的容器(例如列表),但答案是肯定的。 :) – Dave 2010-05-05 03:41:35

回答

13

C#中的結構可以在調用或不調用構造函數的情況下創建。在沒有構造函數被調用的情況下,struct的成員將被初始化爲默認值(基本歸零),並且struct只有在其所有字段都被初始化之後才能使用。

從文檔:

當您使用 新的運營商一個結構對象時,它會創建並 適當的構造函數被調用。 與類不同,可以在不使用新的 運算符的情況下實例化結構體 。如果您不使用新的字段,則 字段將保持未分配狀態,並且 對象在所有 字段初始化之前不能使用。

下面是一些例子:

結構的
struct Bar 
{ 
    public int Val; 

    public Bar(int v) { Val = v; } 
} 

public void Foo() 
{ 
    Bar z;  // this is legal... 
    z.Val = 5; 

    Bar q = new Bar(5); // so is this... 
    q.Val = 10; 

    // using object initialization syntax... 
    Bar w = new Bar { Val = 42; } 
} 

數組是比單個結構變量不同。 - 當你聲明你聲明的引用變量結構類型的數組因爲如此,你必須使用new運營商分配它:

Bar[] myBars = new Bar[10]; // member structs are initialized to defaults 

您也可以選擇使用數組初始化語法,如果你的結構有一個構造函數:

Bar[] moreBars = new Bar[] { new Bar(1), new Bar(2) }; 

你可以比這更復雜。如果您struct具有從原始類型的隱式轉換操作符,你可以像這樣初始化:

struct Bar 
{ 
    public int Val; 

    public Bar(int v) { Val = v; } 

    public static implicit operator Bar(int v) 
    { 
     return new Bar(v); 
    } 
} 

// array of structs initialized using user-defined implicit converions... 
Bar[] evenMoreBars = new Bar[] { 1, 2, 3, 4, 5 }; 
+0

我很尷尬地說,我已經在C#開發了兩年,從未使用過,甚至遇到隱式關鍵字! – Pierreten 2010-05-05 04:31:32

0

結構是在C#中Value Type,所以它使用堆棧內存,而不是堆。

可以以常規方式e.g int a = 90;聲明結構變量,

int是C#中的結構類型。

如果使用new運算符,則會調用相應的構造函數。

相關問題