認知列舉(C# Enum)
當使用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個靜態成員來滿足上述要求,但是要想專業實現它,我們可以傳遞一個列舉型別的引數,這樣我們的程式就強壯和高效許多,並且更加簡潔易懂。
我們首先來看下列舉(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從JDK角度認識列舉enumJDK
- Java 列舉(enum)Java
- TypeScript 列舉enumTypeScript
- ENUM列舉型別型別
- 【python】Enum 列舉類Python
- Java —— 列舉類(enum 類)Java
- 再談java列舉enumJava
- Java - Enum 列舉型別Java型別
- Java 列舉 enum 詳解Java
- Rust的列舉型別EnumRust型別
- 聊聊TypeScript中列舉物件(Enum)TypeScript物件
- Java enum列舉類詳解 列舉的常見用法Java
- 聊一聊Java的列舉enumJava
- 使用列舉ENUM替換Switch或If-Else
- Java列舉enum可以有抽象方法! -RecepİnançJava抽象NaN
- Java列舉:小小enum,優雅而乾淨Java
- C# 列舉與位列舉概述C#
- Java列舉型別enum的詳解及使用Java型別
- c#列舉轉換C#
- PLC結構化文字(ST)——隱式列舉(implicit enum)
- Java 列舉(enum) 詳解7種常見的用法Java
- Enum列舉型別實戰總結,保證有用!型別
- C# enum列舉為0的時候不需要強制轉換,很容易掉坑C#
- 優雅使用前端列舉Enum,符合國標的那種!前端
- 資料結構複習-01enum列舉型別資料結構型別
- C# 中的“智慧列舉”:如何在列舉中增加行為C#
- 在C#中對列舉進行位運算--列舉組合C#
- 我對C#的認知C#
- 我對C#的認知。C#
- C#中Enum的用法C#
- C# 列舉遍歷和轉換C#
- 【C/C++】C和C++11之enum列舉的使用細節C++
- 為什麼使用列舉作為配置項(enum as configuration)是反開發模式的模式
- 訊息佇列概念與認知佇列
- Java 列舉、JPA 和 PostgreSQL 列舉JavaSQL
- 列舉
- 列舉和列舉的取值範圍
- C#列舉(一)使用總結以及擴充套件類分享C#套件
- Java列舉Java