認知列舉(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
- TypeScript 列舉enumTypeScript
- Java 列舉(enum)Java
- ENUM列舉型別型別
- iOS - OC Enum 列舉iOS
- C# Enum列舉型別操作擴充套件類C#型別套件
- Java - Enum 列舉型別Java型別
- Java —— 列舉類(enum 類)Java
- Java 列舉 enum 詳解Java
- java基礎:enum列舉Java
- java中列舉(Enum)使用Java
- 再談java列舉enumJava
- 【python】Enum 列舉類Python
- 聊聊TypeScript中列舉物件(Enum)TypeScript物件
- mysql之ENUM列舉型別MySql型別
- Java enum列舉類詳解 列舉的常見用法Java
- 聊一聊Java的列舉enumJava
- 透過列舉enum實現單例單例
- java enum(列舉)使用詳解 + 總結Java
- C++typedef宣告,enum列舉型別C++型別
- Kotlin-17.列舉類(enum class)Kotlin
- Java enum 列舉還可以這麼用Java
- C#:列舉C#
- C/C++列舉enum分別列印輸出列舉子和列舉值的方法C++
- Java列舉enum可以有抽象方法! -RecepİnançJava抽象NaN
- 使用列舉ENUM替換Switch或If-Else
- Java列舉:小小enum,優雅而乾淨Java
- 關於Java中列舉Enum的深入剖析Java
- JAVA 基礎 - ENUM 列舉的簡單使用Java
- C# 列舉與位列舉概述C#
- Java列舉型別enum的詳解及使用Java型別
- Enum列舉型別實戰總結,保證有用!型別
- Java 列舉(enum) 詳解7種常見的用法Java
- 優雅使用前端列舉Enum,符合國標的那種!前端
- PLC結構化文字(ST)——隱式列舉(implicit enum)
- c#列舉轉換C#
- C# enum列舉為0的時候不需要強制轉換,很容易掉坑C#
- 身份識別協議列舉工具ident-user-enum協議IDE