[英]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.