enum 枚举
- 枚举用来定义常量值的集合。
- 枚举是不能继承的,所有值类型都不能继承。只是复用了继承的语法指定基础类型。
- 枚举可以是任意整型,在enum名称后加
:
指定整型类型 - 整型类型的位数决定了枚举的性能,及能容纳的值个数。
- 声明枚举时要提供 0 值代表 Unknown 或者 None
1
2
3
// 其他可用类型有:byte(1B)、sbyte、short、ushort、int(4B)、uint、long、ulong
public enum Month : int {
}
位标志
- 使用
[System.Flags]
特性, 可以把枚举作为位标志处理(不一定继承byte)。 - 位标志用于表示复合值(标志的集合)。其名称通常为复数。
- 位标志的每个值都要占用二进制的一位,所以能够容纳的值比较少。32位的 int 最多可以容纳32个标志枚举值。
1
2
3
4
5
6
7
8
9
10
11
12
[System.Flags]
public enum WeekDays
{
None = 0x00, //0000 0000 = 0
Sunday = 0x01, //0000 0001 = 1 << 0
Monday = 0x02, //0000 0010 = 1 << 1
Tuesday = 0x04, //0000 0100 = 1 << 2
Wednesday = 0x08, //0000 1000 = 1 << 3
Thursday = 0x10, //0001 0000 = 1 << 4
Friday = 0x20, //0010 0000 = 1 << 5
Saturday = 0x40 //0100 0000 = 1 << 6
};
位标志操作
1
2
3
4
// 检测特定位是否存在
days.HasFlag(WeekDays.Sunday);
// 去掉位标志中的一个元素
days = days & (~WeekDays.Sunday)
位域的使用场景
- Unity的 Layer 定义
- 系统的访问权限
- 执行状态
- 文件的读写属性
enum 和 string 相互转换
- 枚举值转换成字符串(枚举名)
1
WeekDays.Sunday.ToString();
- 字符串转换成枚举值
1
2
// 转换失败返回false
bool success = System.Enum.TryParse("Monday", out WeekDays days);
enum 与 int 相互转换
- 枚举值转换成整型
1
2
(int)Color.Red;
(byte)Color.Green;
- 整型转换成枚举值
1
2
3
4
// 可以强转
(Color)2;
// 也可以例用Enum的静态方法
Color color = (Color)Enum.ToObject(typeof(Color), 2);
- 判断某个整型是否定义在枚举中
1
System.Enum.IsDefined(typeof(Color), 2);
遍历枚举值
1
2
3
4
foreach (Weekdays day in Enum.GetValues(typeof(Weekdays)))
{
Debug.Log((int)day+ ":" + day);
}