ビットタイプの列挙型(FlagsAttribute属性)について
※後に書いた、「FlagsAttributeとビット演算のちょっとしたレシピ」はこちら
→http://d.hatena.ne.jp/zecl/20081223/p1
基本的ではありますが、.NETにおける、ビットタイプの列挙型のお話。
Enum型にFlagsAttribute属性を与えると、ビットフィールドとして扱えます。
MSDNの名前付けのガイドラインによると、
また、
ビットフィールドである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 (|) 演算による表現が可能ってことですね。
[C#]
[Flags]
[Serializable]
[ComVisible(true)]
public enum Keys
ビットタイプの列挙体にすべきなのか、そうではないのか・・・
適材適所で使っていきましょう(`・ω・´)