在 C# 中,枚举 用于将常量名称分配给一组数字整数值。 它使常量值更具可读性,例如,当引用一周中的某一天时,WeekDays.Monday 比数字 0 更具可读性。
枚举是使用 enum 关键字直接在命名空间、类或结构中定义的。 所有常量名都可以在大括号内声明并用逗号分隔。 以下定义了工作日的枚举。
enum WeekDays
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
上面, WeekDays 枚举在每行中声明成员,以逗号分隔。
如果未将值分配给枚举成员,则编译器将默认为每个成员分配整数值,默认情况下从零开始。 枚举的第一个成员将为 0,并且每个后续枚举成员的值都增加 1。
enum WeekDays
{
Monday, // 0
Tuesday, // 1
Wednesday, // 2
Thursday, // 3
Friday, // 4
Saturday, // 5
Sunday // 6
}
您可以为枚举成员分配不同的值。 枚举成员默认值的更改将自动按顺序将增量值分配给其他成员。
enum Categories
{
Electronics, // 0
Food, // 1
Automotive = 6, // 6
Arts, // 7
BeautyCare, // 8
Fashion // 9
}
您甚至可以为每个成员分配不同的值。 (推荐用这种方式)
enum Categories
{
Electronics = 1,
Food = 5,
Automotive = 6,
Arts = 10,
BeautyCare = 11,
Fashion = 15,
WomanFashion = 15
}
枚举可以是任何数字数据类型,例如 byte、sbyte、short、ushort、int、uint、long 或 ulong。 但是,枚举不能是字符串类型。
将枚举名称后的类型指定为:类型。 下面定义了字节枚举。
enum Categories: byte
{
Electronics = 1,
Food = 5,
Automotive = 6,
Arts = 10,
BeautyCare = 11,
Fashion = 15
}
可以使用打点语法访问枚举: enum.member
enum WeekDays
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
Console.WriteLine(WeekDays.Monday); // Monday
Console.WriteLine(WeekDays.Tuesday); // Tuesday
Console.WriteLine(WeekDays.Wednesday); // Wednesday
Console.WriteLine(WeekDays.Thursday); // Thursday
Console.WriteLine(WeekDays.Friday); // Friday
Console.WriteLine(WeekDays.Saturday); // Saturday
Console.WriteLine(WeekDays.Sunday); // Sunday
需要显式转型才能从枚举类型转换为其底层整数类型。
enum WeekDays
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
Console.WriteLine(WeekDays.Friday); //输出: Friday
int day = (int) WeekDays.Friday; // enum to int conversion
Console.WriteLine(day); //输出: 4
var wd = (WeekDays) 5; // int to enum conversion
Console.WriteLine(wd);//输出: Saturday
枚举同样可以用来表示 位标记。 这个时候枚举值一般从1开始。下一个都是前面的2倍。我们可以用0x来方便定义它。 同样我们也可以用位运算符对它进行运算。 如下 我们定义了一个权限枚举 (使用的是unit 可以容纳32位,UInt64的话就可以64位了)
[Flags]
public enum PermissionType : uint
{
Product = 1, // 0b_0001,
Category = 2, // 0b_0010 也可以用左移运算符 1 << 1
Order = 4, // 0b_0100 1 << 2
Blog = 8, // 0b_1000 也可以用左移运算符 1 << 3
m = 0x10,
a = 0x20,
l = 0x40,
ma = 0x80,
dot = 0x100,
net = 0x200,
kk = 0x400,
ll = 0x800,
mm = 0x1000,
n = 0x2000,
max = 0x80000000,
//max = 0b_1000_0000_0000_0000_0000_0000_0000_0000,
}
class Program
{
static async Task Main(string[] args)
{
var type = PermissionType.Product | PermissionType.Category;
Console.WriteLine(type); // 输出了 Product, Category 如果没有加Flags attribute的话,这种不存在枚举值,是会输出 3。
Console.WriteLine((int)type); // 3
}
}
使用HasFlag方法,我们就可以用来判断这个标记位是不是存在。(在权限这边就意味着有权限了)
class Program
{
static async Task Main(string[] args)
{
var type = PermissionType.Product | PermissionType.Category;
Console.WriteLine(type.HasFlag(PermissionType.Product)); //true
Console.WriteLine(type.HasFlag(PermissionType.Order)); //false
//如果 没有这个方法的话则也可以用下面的方法来判断
Console.WriteLine((type & PermissionType.Product) == PermissionType.Product); // true;
Console.WriteLine((type | PermissionType.Product) == type); // true;
Console.ReadKey();
}
}
class Program
{
static async Task Main(string[] args)
{
var type = PermissionType.Product | PermissionType.Category | PermissionType.Blog;
type &= ~PermissionType.Product;
Console.WriteLine(type);//Category, Blog
}
}