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"时,查找枚举实例相关的参数如果都能被匹配的话就会返回对应的常量字段名称;否则就会返回没有匹配的参数值部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值