2019年5月16日 星期四

幾個 C# struct 型別特性

幾個 C# struct 型別特性

這篇文章將會針對 struct 型別的相關特性,寫在這篇文章中
struct 型別在 C# 中,是屬於 value 數值型別,而不是 reference 參考型別,因此,對於使用 struct 型別所產生出來的執行個體,其該物件將會儲存在 Stack 堆疊中,而不是 Heap 堆積。

在 struct 型別中,是不能使用預設建構式

在底下的範例程式碼,將會在 struct 結構中設計了預設建構函式,這樣會造成兩種錯誤,第一個是 struct 型別中,無法使用預設建構函式,也就是編譯器會產出底下的錯誤訊息:
CS0568    結構無法包含明確無參數的建構函式
C Sharp / C#
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'。
C Sharp / C#
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 的執行個體物件。經過這樣的修正,除了編譯器不會產生錯誤訊息,執行上也都會正常運作。
C Sharp / C#
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 成員之前,需要先做到該成員的定義,如同底下程式碼,就可以使用囉。
C Sharp / C#
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'
C Sharp / C#
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);
    }
}



沒有留言:

張貼留言