幾個 C# struct 型別特性
這篇文章將會針對 struct 型別的相關特性,寫在這篇文章中
struct 型別在 C# 中,是屬於 value 數值型別,而不是 reference 參考型別,因此,對於使用 struct 型別所產生出來的執行個體,其該物件將會儲存在 Stack 堆疊中,而不是 Heap 堆積。
在 struct 型別中,是不能使用預設建構式
在底下的範例程式碼,將會在 struct 結構中設計了預設建構函式,這樣會造成兩種錯誤,第一個是 struct 型別中,無法使用預設建構函式,也就是編譯器會產出底下的錯誤訊息:
CS0568 結構無法包含明確無參數的建構函式
public struct MyStruct
{
public MyStruct()
{
}
public int X { get; set; }
public int Y { get; set; }
}
另外一點也是非常重要的,那就是在 struct 中,若有設計了建構函式,當然要設計具有參數的建構函式,此時,所有該 struct 內的成員,需要進行初始化的定義,否則將會造成如同底下的錯誤訊息。
CS0843 在控制權回到呼叫端之前,必須完整指派自動實作的屬性 'MyStruct.X'。
CS0843 在控制權回到呼叫端之前,必須完整指派自動實作的屬性 'MyStruct.Y'。
例如,在底下的範例程式碼中,將沒有了預設建構函式,而是建立一個需要傳入 int 的建構函式,在建構函式內,將只會針對該 struct 成員 X 做出初始化定義,而成員 Y 則是沒有作任何處理,因此,將會產生出底下的錯誤訊息。
CS0843 在控制權回到呼叫端之前,必須完整指派自動實作的屬性 'MyStruct.Y'。
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
}
public int X { get; set; }
public int Y { get; set; }
}
CS0568 結構無法包含明確無參數的建構函式
public struct MyStruct
{
public MyStruct()
{
}
public int X { get; set; }
public int Y { get; set; }
}
CS0843 在控制權回到呼叫端之前,必須完整指派自動實作的屬性 'MyStruct.X'。
CS0843 在控制權回到呼叫端之前,必須完整指派自動實作的屬性 'MyStruct.Y'。
CS0843 在控制權回到呼叫端之前,必須完整指派自動實作的屬性 'MyStruct.Y'。
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
}
public int X { get; set; }
public int Y { get; set; }
}
在 struct 型別中,有無使用 new 運算子來建立一個執行個體
在底下範例中, Main 方法內,宣告一個識別字 myStruct ,其型別為 MyStruct,緊接著要將其成員 X 輸出到螢幕上,對於這樣簡單的程式碼,卻會造成編譯時期的錯誤訊息,如下所示:
CS0165 使用未指派的區域變數
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
Y = locationX;
}
public int X { get; set; }
public int Y { get; set; }
}
class Program
{
static void Main(string[] args)
{
MyStruct myStruct;
Console.WriteLine($"{myStruct.X}");
}
}
針對這樣的錯誤,可以修改 Main 方法內對於 myStruct 的宣告,修改成為當對 myStruct 變數進行宣告的時候,也順便做出對其定義的表示式,在這裡將會使用 new 運算子來產生一個 MyStruct struct 的執行個體物件,另外,也可以單獨建立一個 MyStruct struct 的執行個體物件。經過這樣的修正,除了編譯器不會產生錯誤訊息,執行上也都會正常運作。
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
Y = locationX;
}
public int X { get; set; }
public int Y { get; set; }
}
class Program
{
static void Main(string[] args)
{
MyStruct myStruct = new MyStruct();
myStruct = new MyStruct(100);
Console.WriteLine($"{myStruct.X}");
}
}
另外,是可以做到當 struct 的沒有透過 new 關鍵字來建立一個執行個體物件,並且可以直接使用;此時,需要修正該 struct 型別內,將 屬性 Property 成員替換成為 欄位 Field,如此,就可以僅宣告這個 MyStruct 型別的變數,當要使用某個 struct 成員之前,需要先做到該成員的定義,如同底下程式碼,就可以使用囉。
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
Y = locationX;
}
public int X;
public int Y;
}
class Program
{
static void Main(string[] args)
{
MyStruct myStruct;
myStruct.X = 999;
Console.WriteLine(myStruct.X);
}
}
不過,若對於僅宣告 MyStruct 的變數,僅僅定義成員 Y,而未事先定義成員 X ,如底下程式碼,就會產生底下的錯誤訊息,而造成無法成功建置此專案。
CS0170 使用可能未指派的欄位 'X'
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
Y = locationX;
}
public int X;
public int Y;
}
class Program
{
static void Main(string[] args)
{
MyStruct myStruct;
myStruct.Y = 999;
Console.WriteLine(myStruct.X);
}
}
CS0165 使用未指派的區域變數
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
Y = locationX;
}
public int X { get; set; }
public int Y { get; set; }
}
class Program
{
static void Main(string[] args)
{
MyStruct myStruct;
Console.WriteLine($"{myStruct.X}");
}
}
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
Y = locationX;
}
public int X { get; set; }
public int Y { get; set; }
}
class Program
{
static void Main(string[] args)
{
MyStruct myStruct = new MyStruct();
myStruct = new MyStruct(100);
Console.WriteLine($"{myStruct.X}");
}
}
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
Y = locationX;
}
public int X;
public int Y;
}
class Program
{
static void Main(string[] args)
{
MyStruct myStruct;
myStruct.X = 999;
Console.WriteLine(myStruct.X);
}
}
CS0170 使用可能未指派的欄位 'X'
public struct MyStruct
{
public MyStruct(int locationX)
{
X = locationX;
Y = locationX;
}
public int X;
public int Y;
}
class Program
{
static void Main(string[] args)
{
MyStruct myStruct;
myStruct.Y = 999;
Console.WriteLine(myStruct.X);
}
}