CLR via C#:枚舉類型和位標誌

枚舉類型:具有以下特性:
1.C#中枚舉類型繼承自基礎類型(byte,sbyte,short,ushort,int(默認),uint,long,ulong) ,但是IL中枚舉類型繼承自System.Enum,並且內部定義了一組常量字段和一個實例字段。其中常量字段的類型爲枚舉類型,常量字段名稱爲符號名稱,常量字段值爲16進制基礎類型值;實例字段類型爲基礎類型,實例字段名稱爲value__。參考代碼如下所示:

// 定義枚舉類型
public enum Color : long
{
	White,
	Red,
	Blue,
	Orange
}

// 對應的真實結構如下所示:
public struct Color : System.Enum
{
	// 一組公共的常量字段
	public const Color White = int64(0x0);
	public const Color Red = int64(0x1);
	public const Color Blue = int64(0x2);
	public const Color Orange = int64(0x3);

	// 一個公共的實例字段,通常用在操作符中
	public int64 value__;
}

2.GetUnderlyingType函數可以用來獲取枚舉類型的基礎類型。
3.ToString函數可以使用指定格式和語言文化將枚舉實例轉換成字符串。
4.Format函數可以使用指定格式將指定參數值對應的枚舉實例轉換成字符串。
5.GetValues函數可以用來獲取枚舉實例數組。其中可以結合泛型來封裝該函數,從而提高類型安全。代碼如下所示:

public static TEnum[] GetEnumValues<TEnum>() where TEnum : struct
{
	return (TEnum[])Enum.GetEnumValues(typeof(TEnum));
}

6.GetName函數可以用來獲取指定常量字段值對應的常量字段名稱。
7.GetNames函數可以用來獲取枚舉類型中常量字段名稱數組。
8. Parse / TryParse / ToObjec函數可以用來獲取指定參數值(常量字段名稱或者常量字段值)的枚舉實例。
9. IsDefined函數可以用來判斷指定參數值在枚舉類型中是否合法。由於該函數內部會以反射的方式區分大小寫查找,所以應該慎用該函數。
10.HasFlag函數用來判定枚舉實例中是否有指定的位域。由於會發生裝箱操作,所以該函數要慎用。
11.枚舉類型裏面不能定義函數,但是可以利用擴展函數機制來模擬向枚舉類型裏面添加函數。

位標誌:枚舉的常量字段值使用進制位來表示。具有以下特性:
1.枚舉類型加上FlagAttribute時,枚舉函數中查找枚舉實例相關的參數會被認爲是一組位標誌參數。
2.枚舉函數中使用格式"F"時,查找枚舉實例相關的參數如果都能被匹配的話就會返回對應的常量字段名稱;否則就會返回沒有匹配的參數值部分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章