認知列舉(C# Enum)

草上爬發表於2009-02-05
當使用C#時物件都是在記憶體的堆(Heap)上建立和存取的,這些物件都是引用型別,而像int這樣的基本型別以值型別對待,但是還有兩個非常重要的型別也是值得我們關注的,它們就是列舉型別(enum)和結構型別(struct),很少能讀到關於這兩種C#型別的詳細描述,但是有些時候它們甚至比類(class)還重要,所以我們必須對此進行深入研究,併合理利用之以便提升我們的程式效能。

我們首先來看下列舉(enum)。實際上列舉型別的變數,就是一個命名常量的集合,它們在C#下使用enum關鍵字進行宣告,每一個enum型別都自動繼承自System.Enum類,所以當我們對列舉型別變數進行操作時可以使用System.Enum類下的所有公開方法,可見我們也可以對"列舉型別的變數"稱之為:例項化列舉類的物件。列舉型別其實也是一種值型別,所有資料都儲存在堆疊(stack)上,而不是儲存在堆(heap)上,也就是說我們無需事先分配記憶體,無需new一個enum型別的變數,直接宣告即可使用。宣告一個列舉型別的變數其實有點像設定一個陣列的元素似的,例如:

enum Rating {Poor, Average, Okay, Good, Excellent}

我們還可以將列舉型別的變數作為函式引數進行傳遞,並且還可以對其進行算術運算,例如:

Rating IncrementRating(Rating r)
{
    if(r == Rating.Excellent)
        return r;
    else
        return r+1;
}
Rating DecrementRating(Rating r)
{
    if(r == Rating.Poor)
        return r;
    else
        return r-1;
}

上述函式都將Rating物件作為形參和返回引數,現在我們可以隨意呼叫這兩個函式,如下:

for (Rating r1 = Rating.Poor; r1 < Rating.Excellent ; r1 = IncrementRating(r1))
{
    Console.WriteLine(r1);
}

Console.WriteLine();

for (Rating r2 = Rating.Excellent; r2 > Rating.Poor; r2 = DecrementRating(r2))
{
    Console.WriteLine(r2);
}

我們還可以呼叫System.Enum類的公開方法。呼叫GetNames方法來返回列舉物件中的所有常量名稱,例如:

foreach(string s in Rating.GetNames(typeof(Rating)))
    Console.WriteLine(s);

當一個類的方法需要傳遞一個自定義選項作為引數的時候,譬如,我們有個檔案存取類,該類中有個Open方法,Open方法中有個引數需要傳遞類似:只讀、只寫、可讀可寫、新建、修改等等檔案存取模式,當然你可以建立5個靜態成員來滿足上述要求,但是要想專業實現它,我們可以傳遞一個列舉型別的引數,這樣我們的程式就強壯和高效許多,並且更加簡潔易懂。

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

相關文章