問題是關於結構。當我聲明一個結構類型變量/對象(不知道哪一個適合更好)或者一個數組或結構列表時,我是否必須像構造函數一樣顯式調用構造函數,或者只需聲明變量就足夠了?對於結構體,我必須在C#中顯式調用構造函數嗎?
4
A
回答
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
運算符,則會調用相應的構造函數。
相關問題
- 1. C++我總是必須使用std :: move來調用移動構造函數嗎?
- 2. 「構造函數調用必須是構造函數中的第一條語句」
- 3. 構造函數調用必須是構造函數中的第一條語句
- 4. Java。隱式超級構造函數Employee()未定義。必須顯式調用另一個構造函數
- 5. 在使用Nifty Counter C++ Idiom時,必須調用構造函數兩次嗎?
- 6. 類構造構造函數d必須顯式初始化引用成員
- 7. 我必須在構造函數的第一行調用parent :: __ construct()嗎?
- 8. 在構造函數中使用必須處理的對象
- 9. CLASS函數必須從類的構造函數調用
- 10. 構造函數可以在C++中調用另一個構造函數嗎?
- 11. 自動生成C結構體構造函數嗎?
- 12. 用於調用構造函數(C++)
- 13. 必須定義一個顯式構造函數錯誤Java
- 14. 「構造函數調用必須在構造函數中的第一條語句」的問題在Java中
- 15. Implicit Super Constructor Animal()未定義。必須顯式調用另一個構造函數
- 16. 是規定必須有默認的構造函數在C++中
- 17. 構造函數調用層次結構
- 18. C#調用構造函數
- 19. 我們必須malloc一個結構嗎?
- 20. 顯式調用靜態構造函數
- 21. PdfPTable構造函數中的列數必須大於零
- 22. super()調用必須是構造函數體中的第一條語句
- 23. 在C++中調用的構造函數
- 24. 構造函數不在C++中調用
- 25. 隱式超類構造函數MyNumber()未定義。必須調用另一個構造函數
- 26. 隱式超級構造函數object()未定義。必須明確調用另一個構造函數
- 27. Java ByteArrayInputStream隱式超級構造函數未定義。必須明確調用另一個構造函數
- 28. 隱式超級構造函數。必須明確調用另一個構造函數
- 29. 子類構造函數 - 爲什麼必須爲子類構造函數存在默認構造函數?
- 30. Java錯誤:構造函數調用必須是第一條語句在構造函數中
不確定您是否也在問您是否需要新的容器(例如列表),但答案是肯定的。 :) –
Dave
2010-05-05 03:41:35