C# Flag 标志枚举结果计算过程

C# Flag 标志枚举结果计算过程

using System;

namespace EnumSample
{
    [Flags]
    public enum DaysOfWeek
    {
        Monday = 0x1,
        Tuesday = 0x2,
        Wednesday = 0x4,
        Thursday = 0x8,
        Friday = 0x10,
        Saturday = 0x20,
        Sunday = 0x40,
        Weekend = Saturday | Sunday,
        Workday = 0x1f,
        AllWeek = Workday | Weekend
    }
class Program
    {
static void Main()
        {
            DaysOfWeekSamples();
            ColorSamples();
            UsingEnumClass();

            Console.ReadLine();
        }

private static void DaysOfWeekSamples()
        {
            DaysOfWeek mondayAndWednesday = DaysOfWeek.Monday | DaysOfWeek.Wednesday;
            Console.WriteLine(mondayAndWednesday);//求解输出的值得计算过程
            DaysOfWeek weekend = DaysOfWeek.Saturday | DaysOfWeek.Sunday;
            Console.WriteLine(weekend);
            DaysOfWeek workday = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday | DaysOfWeek.Thursday  | DaysOfWeek.Friday;
            Console.WriteLine(workday);
        }
}
}

求解输出的值得计算过程

当你在枚举类型上定义了 [Flags] 属性时,可以使用位运算符 (| 或) 将多个常量合并成一个值。

例如,在 DaysOfWeek 枚举中,Monday 的值为 0x1,Wednesday 的值为 0x4,因此 Monday | Wednesday 的值为 0x1 | 0x4 = 0x5。

在 DaysOfWeekSamples 方法中:

mondayAndWednesday 的值为 DaysOfWeek.Monday | DaysOfWeek.Wednesday,即 0x1 | 0x4 = 0x5。

weekend 的值为 DaysOfWeek.Saturday | DaysOfWeek.Sunday,即 0x20 | 0x40 = 0x60。workday 的值为 DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday | DaysOfWeek.Thursday | DaysOfWeek.Friday,即 0x1 | 0x2 | 0x4 | 0x8 | 0x10 = 0x1f。

因此,输出的值分别为 5,60 和 31。