Enum(列舉) 在 C 語言時代就是賦予常數值可讀意義的簡便方法,效果是列舉出多個常數,並設定數值。
以下是C語言的例子:
enum{ stop, stand,
run };
大括號中每一個元素稱為列舉元。 如果沒設定數值,預設是從0開始遞增。如果要設定數值,可以這樣打 enum{ stop=5, stand, run }; 這樣就會變成 (stop=5 ; stand=6 ; run=7) 也可以這樣用 enum{ stop=5, stand, run=2 };
Enum列舉是Java裡很常見的一個型別,Java 的列舉型別是一種特殊型別,當我們要在列舉型別的場合中加上泛型能力時,需要運用一些不同的處理手段。我們也需要用到 Reflection (反射)。
以下是Java Enum的class定義:
public abstract class Enum<E extends Enum<E>> implements
Comparable<E>, Serializable {
public final int compareTo(E o)
{
Enum other = (Enum)o;
Enum self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() !=
other.getDeclaringClass())
throw new
ClassCastException();
return self.ordinal - other.ordinal;
}
}
Enum是個抽象類別,無法直接實例化,它實作了Comparable介面,在compareTo()方法中,主要是針對ordinal成員比較,也就是在需要排序Enum實例的場合,是依據ordinal成員進行排序。
在C#裡Enum 關鍵字用來宣告列舉型別 (Enumeration),是由一組名為列舉值清單的具名常數所構成的獨特型別,Enum算是整數(int)型別,當然,也可以指定成long, byte, short.....等型別,我們叫作「基底型別」。例如:
enum Days { Sat, Sun, Mon, Tue, Wed, Thu, Fri };
每個列舉型別都有基礎型別,此基礎型別可以是除了char型別以外的任何整數型別。列舉項目的預設基礎型別是int。根據預設,第一個列舉值的值是0,而每一個接下來的列舉值會遞增1,列舉值的名稱中可能不包含空格。
不論是指派其它值做為新版本的列舉,或是變更新版本之列舉成員的值,都可能造成相依的原始程式碼發生問題。常見的情況是,enum 值用於 switch 陳述式中,而且如果其他項目又加入至 enum 型別,則預設值的測試將會傳回非預期的 true。
public class EnumTest
{
enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };
static void Main()
{
int x = (int)Days.Sun;
int y = (int)Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
public class EnumTest
{
enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };
static void Main()
{
int x = (int)Days.Sun;
int y = (int)Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
在這個範例裡,宣告了一個 Days 列舉型別。兩個列舉值會明確轉換成整數,然後指派給整數變數。所以在三種程式語言的比較,其實大致上都是大同小異。
以下範例enum型別的轉換是ComPort的三個enum型別的變數 parity, stopbits, handshake,要從字串轉換成enum型別,注意enum 型別的轉換方法:
parity = (System.IO.Ports.Parity)
Enum.Parse(typeof(System.IO.Ports.Parity), "None");
stopbits =
(System.IO.Ports.StopBits) Enum.Parse(typeof(System.IO.Ports.StopBits),
"One");
handshake =
(System.IO.Ports.Handshake) Enum.Parse(typeof(System.IO.Ports.Handshake), "None");
-雲遊山水為知已逍遙一生而忘齡- 電腦神手
沒有留言:
張貼留言