2015-09-04 40 views
2

我有一個如下的結構。我有幾個問題在C中struct的奇怪行爲#

問題1:

struct MyStruct 
{ 
    public MyStruct(int a) 
    { 
     this.a = a; 
     this.b = 10; 
    } 
    public int a; 
    public int b; 
} 

當我刪除this.b從MYSTRUCT constuctor它會給我一個錯誤「字段必須完全控制被返回給調用者之前分配」。但在課堂上的情況下,它不會發生

Problem2:

struct MyStruct 
{ 
    //public MyStruct(int a) 
    //{ 
    //  this.a = a; 
    //  this.b = 10; 
    //} 
    //int asd; 
    //public int MyProperty { get; set; } 
    public void getImplemen() 
    { 
     Console.WriteLine("azsdfa"); 
    } 
    public int a; 
    public int b; 
} 

static void Main(string[] args) 
{ 
    MyStruct myStruct ; 
    myStruct.a = 15;//when I comment this it will give an error 
    myStruct.b = 15; //when I comment this it will give an error 
    myStruct.getImplemen(); 
} 

當我改變MyStruct myStructMyStruct myStruct = new MyStruct(); 它工作正常。

爲什麼這麼說?

+2

這是結構如何工作。你應該堅持上課,直到你明白結構是如何工作的,以及你爲什麼要使用結構。誠實,無故使用'struct'會給你帶來痛苦。 – Blorgbeard

+0

以後每個問題請問一個問題。 – Blorgbeard

+0

是的Blorgbeard,我會盡力做你對未來問卷調查的建議:) –

回答

4

就是這樣。

默認構造函數將每個字段初始化爲默認值,而具有參數的構造函數強制您初始化結構中的每個字段。

如果你有一個默認構造函數,另一個帶有參數,你會問什麼?呃,我不記得了。很容易檢查你自己的。

+0

我知道那件事,但爲什麼它在課堂上不會給我一個錯誤。這是我的問題。 –

+2

參見:http://stackoverflow.com/questions/721246/why-must-i-initialize-all-fields-in-my-c-sharp-struct-with-a-non-default-constru – Blorgbeard

+0

你不應該'不問爲什麼這個錯誤不會發生在課堂上。它爲您初始化默認值的行爲相當容易理解。結構是奇怪的,應該受到質疑,因此你可以看看@Blorgbeard分享的鏈接。 – SimpleVar

2

它不適合領域分配內存:

MyStruct myStruct; 

分配內存,並在構造函數初始化字段:

MyStruct myStruct = new MyStruct(); 

如果你沒有爲變量分配內存,那麼你不能分配一個值到田野。 Сonstructor分配內存並初始化字段(在控制返回給調用者之前,您需要在構造函數中初始化字段)。

+0

熟悉這一個通過解釋爲什麼(雖然你沒有觸及他的參數)回答他的問題。 +1 – Kaitlyn

0

區別在於結構是值類型,而類是引用類型。當創建一個值類型對象時,將分配內存空間來存儲該值,因此其成員變量不能爲空,而類成員變量可以爲null。因此,編譯器只會在未分配struct成員變量時發出抱怨。

0

記住Structs的縮略圖規則:必須初始化所有字段。值可以由您或默認值提供。

問題1:

當你初始化結構「新」(不帶參數),它在各個領域都被初始化爲默認值類型(0 INT,空字符串等)。由於您使用的是參數化構造函數,因此編譯器不使用默認值,因此如果不初始化字段'b',則會出現錯誤。您仍可以如下這項工作:

public MyStruct(int a) : this() 
{ 
    this.a = a; 
} 

問題2:我在開頭提到

召回拇指規則。所以你要麼使用默認的構造函數'new'初始化,要麼在調用代碼中設置字段值。

快速建議:請不要在類/結構中使用公共字段。使用屬性來封裝它們。