enumeration提供了一些非常炫酷的功能,相信大多數開發人員都不熟悉。這些新功能極大的簡化了應用程式開發。
列舉型別(enumerated types)定義了一組「符號名稱/值」配對。
以下color型別定義了一組符號,每個符號都標識一種顏色:
internal enum color
white,//賦值0
red, //賦值1
greed,//賦值2
blue, //賦值3
orange//賦值4
當然,也可以寫個程式用0代表白色,1代表紅色,以此類推。但不應該將這些數字硬編碼到**中,而應換用列舉型別,因為:
每個列舉型別都直接從system.enum派生,後者從system.valuetype派生。而system.valuetype又從system.object派生。所以,列舉型別是值型別,可表示成未裝箱和已裝箱形式。有別於其他值型別,列舉型別不能定義任何方法、屬性和事件。
編譯列舉型別時,c#編譯器會把每個符號轉換成型別的乙個常量字段。例如,編譯器會把前面的color列舉型別看成以下**:
c#編譯器實際上並不編譯這段**,因為它禁止定義從system.enum這一特殊型別派生的型別。
列舉型別定義的符號是常量值,所以當編譯器一旦發現**引用了乙個列舉型別的符號,就會在編譯時用數值替代符號,**將不再引用定義了符號的列舉型別。
簡單地說,列舉型別只是乙個結構,其中定義了一組常量欄位和乙個例項字段。常量欄位會嵌入程式集的元資料中,並可通過反射來訪問。這意味著在執行時獲得與乙個列舉型別關聯的所有符號及其值。還意味著可以將乙個字串符號轉換成對應的數值。這些操作是通過system.enum基型別來提供的。下面討論其中的一些操作:
例如,system.enum型別有乙個名為getunderlyingtype的靜態方法,而system.type型別有乙個getenumunderlyingtype的例項方法。
public static type getunderlyingtype(type enumtype);
public virtual type getenumunderlyingtype();
這些方法返回用於容納乙個列舉型別的值的基礎型別。每個列舉型別都有乙個基礎型別,可以是byte,short,int(最常用,也是c#預設選擇的),long。c#要求只能指定基元型別名稱,如果使用fcl型別名稱(比如int32),會報錯。
我們定義的列舉型別應該與需要呼叫它的那個型別同級。
以下**演示了如何宣告乙個基礎型別為byte的列舉型別:
internal enum color : byte
white,
red,
greed,
blue,
orange
static void main()
console.writeline(enum.getunderlyingtype(typeof(color)));
c# typeof() 和 gettype()區是什麼?
c#編譯器將列舉型別視為基元型別,所以,可以用許多熟悉的操作符(==,!=,<,>,<=,>=,+,-,^,&,|,++,--)來操縱列舉型別的例項。
所有這些操作符實際作用於每個列舉型別例項內部的value_例項字段。
給定乙個列舉型別的例項,可呼叫從system.enum繼承的tostring方法:
public static class program
static void main()
color c = color.blue;
console.writeline(c.tostring());//"blue" 常規格式
console.writeline(c.tostring("g"));//"blue" 常規格式
console.writeline(c.tostring("d"));//"3" 十進位制格式
console.writeline(c.tostring("x"));//"03" 十六進製制格式
internal enum color : byte
white,
red,
greed,
blue,
orange
format:可呼叫它格式化乙個列舉型別的值:
public static string format(type enumtype, object value, string format);
console.writeline(enum.format(typeof(color), 3, "g"));//顯示"blue"
getvalues:獲取列舉型別中定義的所有符號以及對應的值。
public static array getvalues(type enumtype);
color colors = (color)enum.getvalues(typeof(color));
console.writeline("number of symbols defined:" + colors.length);
console.writeline("value\tsymbol\n-----\t------");
foreach (color c in colors)
console.writeline("\t", c);
getname:返回數值的字串表示。
enum.getname(typeof(color), 3);//"blue"
getnames:返回乙個string陣列,每個符號都代表乙個string。
enum.getnames(typeof(color));
//
//[0]: "white"
//[1]: "red"
//[2]: "greed"
//[3]: "blue"
//[4]: "orange"
parse, tryparse:將乙個符號轉換成列舉型別的例項。
public static object parse(type enumtype, string value, bool ignorecase);
color c = (color)enum.parse(typeof(color), "orange", true); //orange
enum.parse(typeof(color), "0", true);//white
bool a=enum.tryparse("brown", false, out c);//false, 列舉中沒有定義brown
isdefine:判斷乙個值對於乙個列舉型別是否合法。
enum.isdefined(typeof(color), "white");//false, 執行的是區分大小寫的檢查
enum.isdefined(typeof(color), 5);//false, color列舉型別沒有與5對應的符號
我們可以將位標誌當做一種特殊的列舉型別。
fileattributes型別是基本型別為int32的列舉型別,其中每一位都反映檔案的一項屬性。
[flags] //指示可以將列舉作為位域(即一組標誌)處理。
public enum fileattributes
readonly = 1,
hidden = 2,
system = 4,
directory = 16,
archive = 32,
device = 64,
normal = 128,
temporary = 256,
sparsefile = 512,
reparsepoint = 1024,
compressed = 2048,
offline = 4096,
notcontentindexed = 8192,
encrypted = 16384,
integritystream = 32768,
noscrubdata = 131072
以上fileattributes型別中,1的二進位制為1,2的二進位制為10,4的二進位制為100。也就是說可以用每個二進位制位來確認唯一性,這就是位標誌的原理。
public static void main()
string file = assembly.getentryassembly().location;
//呼叫system.io.file型別的getattributes方法,會返回fileattributes型別的乙個例項
fileattributes attributes = file.getattributes(file);
//因為二進位制1&1才為1,所以只要存在最後的數值一定不為1,判斷檔案是否隱藏
console.writeline("is hidden?", file, (attributes & fileattributes.hidden) != 0);
//判斷檔案是否隱藏,換種寫法。enum有乙個hasflag方法,確定當前例項attributes中是否設定了乙個或多個位域
console.writeline("is hidden?", file, attributes.hasflag(fileattributes.hidden));
//將乙個檔案的屬性改為唯讀和隱藏
file.setattributes(file, fileattributes.readonly | fileattributes.hidden);
CLR via C 列舉型別和位標誌
列舉型別 具有以下特性 1.c 中列舉型別繼承自基礎型別 byte,sbyte,short,ushort,int 預設 uint,long,ulong 但是il中列舉型別繼承自system.enum,並且內部定義了一組常量欄位和乙個例項字段。其中常量欄位的型別為列舉型別,常量欄位名稱為符號名稱,常量...
CLR via C 15 列舉型別和位標誌
原文 clr via c 15.列舉型別和位標誌 一 列舉型別 列舉型別 enumerated types 定義了一組 符號名稱 值 配對。例如,以下color型別定義了一組符號,每個符號都標識一種顏色 internal enum color 使用列舉型別的好處 1 列舉型別使程式更容易編寫 閱讀和...
第十五章 列舉型別和位標誌
目錄 15.1 列舉型別和位標誌 15.2 位標誌 15.3 向列舉型別新增方法 列舉型別定義了一組 符號名稱 值 配對。列舉型別使程式更容易編寫,閱讀和維護。列舉型別時強型別的。列舉型別從system.enum派生,是值型別,可用未裝箱和已裝箱的形式來表示。但不能定義任何方法,屬性或事件。可利用c...