18 Jun

[Flags] Enum Attribute And Bitwise Operation In C#

The flags attribute should be used whenever the enumerable represents a collection of flags, rather than a single value. We must use multiples of two in our enumeration to use bitwise operations. Such collections are usually manipulated using bitwise operators, For example:

MyColors themeColors = MyColors.Yellow | MyColors.Red;

Example enum decleration:

    [Flags]
    public enum MyColors : int
    {
        Yellow  = 1,
        Green   = 2,
        Red     = 4,
        Blue    = 8,
        Orange  = 16,
        Black   = 32,
        White   = 64,
    }

The flags attribute doesn’t change enum values. It is enable a nice representation by the .ToString() method:

"themeColors.ToString" =>  "Yellow, Red"

Enumeration values looks like this:
Yellow = 0000001
Green = 0000010
Red = 0000100
Blue = 0001000
Orange = 0010000
Black = 0100000
White = 1000000

themeColors instance looks like this:
themeColors = 0000101

To retrieve the distinct values in our property one can do this,
Usage:

            if ((themeColors & MyColors.Red) == MyColors.Red)
            {
                Console.WriteLine("Red is a theme color.");
            }

            if ((themeColors & MyColors.Green) == MyColors.Green)
            {
                Console.WriteLine("Green is a theme color.");
            }

themeColors is 0000101
MyColor.Red is 0000100
———————————–(BITWISE AND)
Result is 0000100 -> It is a red color

Also we can use the bit-shifting for setting the enum values. It is more simple and more readable.
Example enum decleration using bit-shifting:

    /// 
    /// using bit-shifting
    /// 
    [Flags]
    public enum MyColors_SetValuesWithBitShifting
    {
        Yellow  = 1 << 0,
        Green   = 1 << 1,
        Red     = 1 << 2,
        Blue    = 1 << 3,
        Orange  = 1 << 4,
        Black   = 1 << 5,
        White   = 1 << 6,
    }