ようこそ。睡眠不足なプログラマのチラ裏です。

ビットタイプの列挙型(FlagsAttribute属性)について

※後に書いた、「FlagsAttributeとビット演算のちょっとしたレシピ」はこちら
http://d.hatena.ne.jp/zecl/20081223/p1


基本的ではありますが、.NETにおける、ビットタイプの列挙型のお話。


Enum型にFlagsAttribute属性を与えると、ビットフィールドとして扱えます。
MSDNの名前付けのガイドラインによると、

Enum型には単数形の名前を使用しますが、
ビットフィールドであるEnum型には複数形の名前を使用します。

また、

ビットフィールドであるEnum型は、
列挙定数を、2の累乗 (1、2、4、8…) で定義してください。
これは、結合された列挙定数の各フラグが重複しないことを意味します。

だそうです。


以下サンプルコード.

[C#]
using System;

///


/// 色クラス
///

public class ColorTest
{
    [FlagsAttribute]
    public enum Colors
    {
        Black = 0,
        Red = 1,
        Green = 2,
        Blue = 4,
        Yellow = 8
    }
    
    public static void Main( )
    {
        for(int i = 0; i < 9; i++)
        {
            Colors colors = (Colors)i;
            Console.WriteLine("{0} : {1}", i, colors.ToString());
        }
    }
}

[実行結果]
0 : Black
1 : Red
2 : Green
3 : Red, Green
4 : Blue
5 : Red, Blue
6 : Green, Blue
7 : Red, Green, Blue
8 : Yellow

@たとえば、KeyDownイベントまたは KeyUpイベントのデータを提供する、
System.Windows.Forms.KeyEventArgsクラスのメンバであるKeyCodeは、
以下に示すKeys列挙体であり、FlagsAttribute属性が含まれているので、
ビット単位の OR (|) 演算による表現が可能ってことですね。

[VB.NET]



Public Enum Keys

[C#]
[Flags]
[Serializable]
[ComVisible(true)]
public enum Keys

ビットタイプの列挙体にすべきなのか、そうではないのか・・・
適材適所で使っていきましょう(`・ω・´)