.NET Core 实战 [No.88~93] 枚举
枚举是值类型。通过 enum
关键字声明枚举。
csharp
enum Options
{
OneWay = 1,
TwoWay = 2,
MixWay = 3,
}
枚举的常量值默认为 int
型,但可以通过 :
指定其基础类型,但必须是整数值的基础类型,如 int,byte,unit,long,ulong 等。
csharp
enum ReadMode : byte
{
NewFile = 1,
OpenCurrent = 2,
Saved = 3,
}
枚举类型也可以支持位运算,需要在枚举定义上添加 FlagsAttribute
特性。
另外还要注意每个常量值的分配。一般来说,常量值是以 2 为底数的幂运算结果。
csharp
[Flags]
enum MultiHue : short
{
None = 0,
Black = 1,
Red = 2,
Green = 4,
Blue = 8,
}
使用 |
运算符可以组合两个枚举值。
使用 HasFlag()
方法可以判断组合后的枚举值中是否含有指定的枚举项。需要注意的是值为 0 的枚举项是始终会被包含的。
csharp
MultiHue hue = MultiHue.Black | MultiHue.Blue;
Console.WriteLine($"{hue} : {(int)hue}"); // Black, BLue : 9
Console.WriteLine($"hue.HasFlag(MultiHue.Black) = {hue.HasFlag(MultiHue.Black)}"); // hue.HasFlag(MultiHue.Black) = True
Console.WriteLine($"hue.HasFlag(MultiHue.Red) = {hue.HasFlag(MultiHue.Red)}"); // hue.HasFlag(MultiHue.Red) = False
Console.WriteLine($"hue.HasFlag(MultiHue.None) = {hue.HasFlag(MultiHue.None)}"); // hue.HasFlag(MultiHue.None) = True
没有给枚举项指定具体的常量值时,会自动分配一个整数值,值为前一个枚举项的值加 1,若是第一个枚举项,则默认值为 0。
csharp
enum Example
{
ItemA,
ItemB,
ItemC = 10,
ItemD,
ItemE,
}
测试代码:
csharp
Console.WriteLine($"{Example.ItemA} = {(int)Example.ItemA}"); // ItemA = 0
Console.WriteLine($"{Example.ItemB} = {(int)Example.ItemB}"); // ItemB = 1
Console.WriteLine($"{Example.ItemC} = {(int)Example.ItemC}"); // ItemC = 10
Console.WriteLine($"{Example.ItemD} = {(int)Example.ItemD}"); // ItemD = 11
Console.WriteLine($"{Example.ItemE} = {(int)Example.ItemE}"); // ItemE = 12
Enum 类提供了一系列方法(包括示例方法和静态方法),可以对枚举类型进行各种处理。
其中 GetName()
方法可以获取某个枚举项的名称, GetNames()
可以获取某个枚举类型中所有枚举项的名称。
csharp
Console.WriteLine($"{Enum.GetName(typeof(DayOfWeek), DayOfWeek.Sunday)}");
// Sunday
var days = Enum.GetNames(typeof(DayOfWeek));
foreach (var d in days)
{
Console.WriteLine(d);
}
// Sunday
// Monday
// Tuesday
// Wednesday
// Thursday
// Friday
// Saturday
参考:《.NET Core 实战:手把手教你掌握 380 个精彩案例》 -- 周家安 著