第15章 列舉型別和位標誌

2022-09-02 10:06:12 字數 4739 閱讀 1485

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...