簡體   English   中英

C#中Struct的奇怪行為

[英]Strange behavior of Struct in C#

我有一個如下結構。 我沒什么問題

問題1:

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

當我從MyStruct構造器中刪除this.b時,它將給我一個錯誤“必須將字段完全分配,然后控制權才能返回給調用者”。 但在上課的情況下不會發生

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 myStruct更改為MyStruct myStruct = new MyStruct (); 它工作正常。

為什么這樣?

就是這樣。

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

如果您有一個默認的構造函數和一個帶參數的構造函數,您會問? 好吧,我不記得了。 很容易自己檢查。

它不為字段分配內存:

MyStruct myStruct;

分配內存並初始化構造函數中的字段:

MyStruct myStruct = new MyStruct();

如果不為變量分配內存,則不能為字段分配值。 構造函數分配內存並初始化字段(在將控制權返回給調用者之前,您需要在構造函數中初始化字段)。

您應該參考https://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx

您需要在使用結構之前創建該結構的實例。

區別在於,結構是值類型,而類是引用類型。 創建值類型對象時,將分配存儲空間來存儲值,因此其成員變量不能為null,而類成員變量可以為null。 因此,編譯器僅在未分配結構成員變量時抱怨。

記住結構的經驗法則:必須初始化所有字段。 值可以由您提供,也可以由默認值提供。

對於問題1:

當您使用'new'(不帶參數)初始化struct時,其中的所有字段都將初始化為默認類型值(對於int為0,對於字符串為null等)。 由於您使用的是參數化構造函數,因此編譯器不使用默認值一,因此,如果不初始化字段“ b”,則會出錯。 您仍然可以按以下方式進行這項工作:

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

對於問題2:

回想一下我一開始提到的經驗法則。 因此,您可以將默認構造函數與“ new”初始化一起使用,或者在調用代碼中設置字段值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM