1. 程式人生 > >14.C#基礎之列舉(完成)

14.C#基礎之列舉(完成)

     列舉型別是一種獨特的值型別,它用於宣告一組命名的常數。

  14.1列舉宣告

     列舉宣告以關鍵字enum開始,然後定義列舉的名稱、可訪問性、基礎型別和成員。

     每個列舉型別都有一個對應的整型,稱為該列舉型別的基礎型別。此基礎型別必須能表示該列舉中定義的所有列舉數值。列舉宣告可以顯式地宣告byte、sbyte、short、ushort、int、uint、long或ulong型別作為基礎型別,預設的列舉型別是int。比如:

     宣告一個基礎型別為long的列舉。

  14.2列舉修飾符

     列舉宣告的修飾符與類宣告的修飾符具有相同的意義。列舉是不能抽象的,也不能是派生。

  14.3列舉成員

     任意的兩個列舉成員不能具有相同的名稱。

     每個列舉成員均有相關聯的常數值,此值得型別就是包含了它的列舉的基礎型別,且這個值必須在基礎型別的範圍之內;多個列舉成員可以共享同一個關聯值。比如:

     上面的這兩個列舉成員Blue和Max就具有相同的關聯之。

     一個列舉成員的關聯值可以是隱式地,也可以是顯式地。如果列舉成員的宣告中具有常數表示式初始值設定項,則該值就是該列舉成員的關聯值;如果沒有初始值設定項,可以按照下面規則設定:

          1.如果列舉成員是在列舉型別中宣告的第一個列舉成員,則它的關聯值是零;

          2.否則,列舉成員的關聯值是前一個列舉成員的關聯值加1得到的,加之後的值必須在基礎類型範圍之內;否則會報錯。

     Red的值為0,Green的值是10,Blue的值是11。

     除了迴圈性限制外,列舉成員初始值設定項可以自由地引用其他的列舉成員設定項,而不必考慮它們所在的文字位置的排列順序。比如:

     上面這個就是迴圈性,A和B宣告是迴圈的,A顯式依賴於B,而B隱式依賴於A。

     列舉成員的命名方式和作用範圍和類中的欄位完全類似。列舉成員是不具有任何訪問行宣告的。

  14.4System.Enum型別

     System.Enum型別是所有列舉型別的抽象基類,它是一種與列舉型別的基礎型別不同的獨特型別,並且從System.Enum繼承的成員在任何列舉型別都可以用;存在從任何列舉型別到System.Enum的裝箱轉換,同時從System.Enum到任何列舉型別的拆箱轉換。

     但System.Enum本身不是列舉型別,而實類型別,所有列舉型別都是從它派生;而System.Enum是從型別System.ValueType派生,System.ValueType是從object型別派生。

     在執行時,型別System.Enum的值可以是null,也可以是對任何列舉型別的裝箱的值的引用。

  14.5列舉值和運算

     每個列舉型別都定義了一個獨特型別,需要使用顯式列舉轉化在列舉型別和整數之間或兩個列舉型別之間進行轉換;比如在列舉型別E中宣告成員v,值就是(E)v。

     列舉型別的值域不受它的列舉成員限制。詳細說就是列舉的基礎型別的任何一個值都可以被強制轉換為該列舉型別。