【C#】列挙型・Enum ~ フラグ・アトリビュート ~

■ フラグ・アトリビュート(Flags Attribute)

 * Flags属性(FlagsAttributeクラス)を付与することにより、Enum型がビットフラグとして使えるようになる

■ 定義

 * Flags属性([Flags])を付与する

サンプル

[Flags]
public enum SampleEnum
{
    None = 0,
    Sample1 = 1,
    Sample2 = 2,
    Sample3 = 4,
}

■ フラグ操作

フラグを立てる

 *  |演算子(OR演算子) を使う
サンプル
[Flags]
public enum Week
{
    Sunday    = 0x001,
    Monday    = 0x002,
    Tuesday   = 0x004,
    Wednesday = 0x008,
    Thursday  = 0x010,
    Friday    = 0x020,
    Saturday  = 0x040
}

var flag = Week.Saturday;
flag = flag | Week.Sunday;

フラグを下す

 * &演算子(AND演算子) と ~演算子(反転演算子) の組み合わせ
サンプル
var flag = Week.Saturday | Week.Friday;
flag = flag & ~Week.Friday;
}

■ 関連メソッド

Enum.HasFlag()

 * From .NET Framework4
 * 指定したビットフィールドが設定されているかどうかを判断するEnum.HasFlag メソッドが追加された
サンプル
enum Country
{
    Japan,
    Italy,
    US,
    Korea,
    India,
    Australia,
    Brazil,
}

private void button1_Click(object sender, EventArgs e)
{
    this.label1.Text = string.Empty;

    Country myStayed = Country.Japan | Country.Italy | Country.Korea;

    if (myStayed.HasFlag(Country.Korea))
    {
        this.label1.Text += "\n韓国に行った事あるの!?";
    }

    if (myStayed.HasFlag(Country.Japan | Country.Italy))
    {
        this.label1.Text += "\nイタリアと日本に行った事あるの!?";
    }

    if (myStayed.HasFlag(Country.Japan | Country.Brazil))
    {
        this.label1.Text += "\nブラジルに行った事あるの!?";
    }
}

従来との比較

 * 大分すっきりした感がある
.NET Framework4以前
if ((myStayed & (Country.Japan | Country.Italy)) == (Country.Japan | Country.Italy))
.NET Framework4
if (myStayed.HasFlag(Country.Japan | Country.Italy))


関連記事

列挙型・Enum ~ 基本編 ~

https://blogs.yahoo.co.jp/dk521123/22338133.html

列挙型・Enum ~ 数値からEnumに変換 ~

https://blogs.yahoo.co.jp/dk521123/29496843.html

列挙型・EnumEnumの文字列化 ~

https://blogs.yahoo.co.jp/dk521123/31367224.html

属性(アトリビュート) ~カスタム属性~

https://blogs.yahoo.co.jp/dk521123/29483903.html