Using enum with System.Flags


Summary

What is System.Flags?

Prerequisites

  • C# 8
  • .NET Core v3.1
  • Windows 10 v21H1

Flags enum

In Programming C# 8.0 (プログラミングC# 第8版), it give an example about flags enum at P182. See 例3-100.

[System.Flags]
public enum Ingredients
{
    Eggs           =        0b1,
    Bacon          =       0b10,
    Sausages       =      0b100,
    Mushrooms      =     0b1000,
    Tomato         =   0b1_0000,
    BlackPudding   =  0b10_0000,
    BakedBeans     = 0b100_0000,
    TheFullEnglish = 0b111_1111
}

I’ll try to use Japanese stamp as example for learning.

using System;

namespace Hoge1
{
    [System.Flags]
    public enum 判子
    {
        None = 0,
        課長 = 0b1,
        部長 = 0b10,
        本部長 = 0b100,
        社長 = 0b1000,
    }

    class Program
    {
        static void Main(string[] args)
        {
            判子 stamp = 判子.None;
            Console.WriteLine("({0})", stamp);

            # Set a bit flag.
            stamp |= 判子.課長;
            Console.WriteLine("({0})", stamp);

            stamp |= 判子.部長 | 判子.本部長;
            Console.WriteLine("({0})", stamp);

            # Remove a bit flag.
            stamp &= ~判子.本部長;
            Console.WriteLine("({0})", stamp);

            stamp |= 判子.本部長;
            Console.WriteLine("({0})", stamp);

            stamp |= 判子.社長;
            Console.WriteLine("({0})", stamp);

            # Remove a bit flag.
            if (stamp.HasFlag(判子.社長 | 判子.本部長 | 判子.部長 | 判子.課長))
            {
                Console.WriteLine("Yeah!!!!");
            }
        }
    }
}

References