Skip to content

.NET Core 实战 [No.88~93] 枚举

🏷️ 《.NET Core 实战》

枚举是值类型。通过 enum 关键字声明枚举。

csharp
enum Options
{
    OneWay = 1,
    TwoWay = 2,
    MixWay = 3,
}

枚举的常量值默认为 int 型,但可以通过 : 指定其基础类型,但必须是整数值的基础类型,如 intbyteunitlongulong 等。

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 个精彩案例》 -- 周家安 著