2013年12月23日 星期一

C# - Enum列舉

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 Enumclass定義:

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");

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言