認知結構(C# Struct)

草上爬發表於2009-02-05
在C++語言裡面結構struct和類在許多方面都是相近的,甚至相同,只不過在存取方式上存在差別。但是,在C#下結構和類有著明顯的不同點:

1、結構是堆疊物件,不能在堆上建立它;
2、結構可以繼承介面,但是不能繼承自其它結構;
3、不能重寫結構的預設建構函式,需要自定義建構函式時必須建立附帶引數的建構函式,以保證和預設建構函式的引數列表有所區別;
4、當使用new來建立結構物件時其建構函式自動被呼叫,若僅是像宣告一個int型別的變數那樣宣告一個結構型別的變數而不new的話,那麼結構中成員變數必須被初始化後才能使用該結構物件。

struct Student : IGrade
{
    public int maths;
    public int english;
    public int csharp;

    public int GetTot()
    {
        return maths+english+csharp;
    }

    public Student(int y)
    {
        maths = english = csharp = y;
    }

    public string GetGrade()
    {
        if(GetTot() > 240 )
        return "Brilliant";
        if(GetTot() > 140 )
        return "Passed";
        return "Failed";
    }
}
interface IGrade
{
    string GetGrade();
}

接下來看看怎麼使用剛才建立的結構,程式碼如下:

Student s1 = new Student();
Console.WriteLine(s1.GetTot());
Console.WriteLine(s1.GetGrade());

輸出:
0
Failed

上述程式碼顯示預設的建構函式被呼叫,建構函式將所有結構中的int成員變數都自動初始化為0,這就是為何合計為0的原因。

下面來看一段有意思的程式碼:

Student s2;
s2.maths = s2.english = s2.csharp = 50;
Console.WriteLine(s2.GetTot());
Console.WriteLine(s2.GetGrade());

輸出:
150
Passed

上述程式碼我們沒有使用new來建立結構,所以建構函式不會被呼叫,僅是宣告一個結構型別的變數s2,但是緊接著我們為結構的所有成員變數進行初始化賦值,那麼結構照樣可以使用。儘管很多人都在爭論,認為這種賦值伎倆太不專業且顯得有點傻,然而誰也無法找到合情合理的解釋,但是這樣做的確可行。當我們註釋掉賦值語句後,編譯器則會報錯:使用了未賦值的本地變數s2。

我們還可以使用自定義建構函式並傳遞一個整型變數來建立結構物件,程式碼如下:

Student s3 = new Student(90);
Console.WriteLine(s3.GetTot());
Console.WriteLine(s3.GetGrade());

輸出:
270
Brilliant

不像類是引用型別,結構是值型別的,所以結構比類操作起來更簡單。當使用類僅儲存一些資料時,你會發現使用結構會好得多!結構化陣列是在堆上建立的,而以一個一個類的形式來建立物件,則必須提前在堆上分配記憶體,而且每個類的引用地址也需要額外儲存起來,所以使用結構化陣列則更加的有效率。實際上在.Net框架裡大部分類也都是結構,譬如:System.Drawing.Point。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14325734/viewspace-545395/,如需轉載,請註明出處,否則將追究法律責任。

相關文章