在補習完C#類以及一些文法上的知識後,再回到類型上進行補習,本章補習的是C#中的枚舉。
以下是本文所要介紹的內容:
1、枚舉中忽略的知識。
2、枚舉常見的各種使用方法。
一、枚舉中忽略的知識
對於枚舉,一般的用法都是用來解決一些代碼的可讀性,如下代碼:
switch(state){ case 0: break; case 1: break;}switch(stateEnum){ case StateEnum.Opened: break; case StateEnum.Closed; break;}
通過對比上面的代碼,我們可以很容易的看出使用了枚舉後代碼的可讀性更強了,而本文不是來介紹如何枚舉的基礎知識的,而是記錄下我忽略過的一些知識,也可能是你所需要瞭解的:
1、枚舉中的實值型別預設為int,當然也可以是short,long等數實值型別,但是不能是char、string等類型。
如果想更改枚舉的類型只需按照以下代碼既可:
public enum StateEnum:long{}
2、枚舉中的值預設從0開始,並且可以不用給枚舉顯示的指定值,如果不顯示指定值則預設從0開始,每個枚舉在前一個枚舉的值上+1。
3、枚舉是實值型別但是其並不是直接繼承實值型別的基底類型:System.ValueType,而是以下的繼承鏈:
System.Object->System.ValueType->System.Enum->具體枚舉
4、對於某個變數有3種或者3種以上的情況的時候應該使用枚舉而不是使用int或者string,因為這樣的代碼可讀性更強。
5、使用枚舉不會帶來什麼效能問題,由於其本質還是實值型別。
二、枚舉常見的各種使用方法
在日常開發的過程中,枚舉可以幫我們解決很多問題,但是也會碰到許多問題,下面列舉了一些枚舉常見的使用方法:
1、可以將枚舉的值指定為另一個枚舉,且如果後續枚舉沒有指定值則會自動增加,如下代碼:
public enum StateEnum{ Opened=0, Closed=1, Error=Closed, UnKnow}
可以看到上面的代碼中,Error的值是使用的和Closed一樣的值,而UnKnow並未指定值,這時根據枚舉的特性,UnKnow的值則應該是2。
2、枚舉數組之間的轉換,如果有2個定義類似或者相同的枚舉組成數組想進行轉換,一般來說是不行的(C#不支援這樣的轉換),而可以通過先將枚舉數組轉成Array然後再轉成相應的枚舉數組,如下代碼:
StateEnum1[] stateEnums=(StateEnum1[])(Array)new StateEnum2[3];
雖然這樣做可以將C#不支援的形式變成可能,但是並不推薦這麼做,因為這樣可能會出現不可預見的錯誤。
而對於枚舉的正常轉換都是可以通過Enum.Parse()進行轉換。
3、如果需要對枚舉進行組合使用(如按位計算),則需要使用FlagAttributes特性,如下代碼:
[Flags] //屬於System.IO命名空間下public enum State{ Read=0,//000 Write=1,//001 Create=2,//010 Delete=4,//100
Allow=Read | Write } public void Test(State state) { if(state==State.Read | State.Write) { } }
一旦使用了Flags特性後,就可以像上面的代碼一樣對枚舉進行組合判斷,但需要注意的是,使用了Flags特性後必須為枚舉顯式的指定值,否則無法使用,同時顯式指定的值最好是2的次冪,如:0,1,2等,這樣可以保證組合的值不會重疊,具體可以查看MSDN:FlagsAttribute 類