C#のFlags Attribute(Enum Flags)

2024/11/15に公開

概要

  • C#のEnum Flagsの機能が便利, C#の機能で知らなかったのでメモ書き
  • 制御時にビット演算を使ってわかりやすくかける
  • 2値属性を大量に持つクラスはEnumFlagsを使って簡潔に管理しよう

Enum Flagsとは

https://learn.microsoft.com/ja-jp/dotnet/api/system.flagsattribute?view=net-8.0

Enum宣言に[Flags]属性を追加することで利用可能。属性の数値は2^nにしておく。複数のパラメータを1つの変数に格納して管理できる。また属性指定や比較についても読む人に優しく指定できるのが良い。

他の言語だとビットフラグの機能を自分で実装するケースが多いが、C#は言語仕様として存在する。楽につかえてGood!!

実装例

[Flags]
public enum FileAccess
{
    None = 0,
    Read = 1 << 0,    // 2^0
    Write = 1 << 1,   // 2^1
    Execute = 1 << 2  // 2^2
}

class Program
{
    static void Main()
    {
        // ビット演算の形で属性を指定できる
        FileAccess permissions = FileAccess.Read | FileAccess.Write;

        Console.WriteLine(permissions); // 出力: Read, Write

        // 書き込み権限があるかをチェック
        // 条件式もビット演算で記述できる
        if ((permissions & FileAccess.Write) == FileAccess.Write)
        {
            Console.WriteLine("Write permission is granted.");
        }

        // 実行権限を追加
        permissions |= FileAccess.Execute;
        Console.WriteLine(permissions); // 出力: Read, Write, Execute

        // 読み取り権限を削除
        permissions &= ~FileAccess.Read;
        Console.WriteLine(permissions); // 出力: Write, Execute
    }
}

Discussion