inohilog

/var/log/inohiro

System.FlagsAttribute クラス

System.FlagsAttribute クラスは、列挙体(enum)をFlagのセットとして扱えるようにするもの。コンソールアプリケーションなどでオプションを文字列の配列として受け取って、それをフラグに展開するときに使える(これを使うといろいろ楽になる)。いわゆるビットフラグと呼ばれるものらしい。

コード

public class Program
{
	private enum NotFlag
	{
		Univ = 1,
		TKB = 2,
		Ichinoya = 4
	}

	[Flags] // [FlagsAttribute] の省略形
	private enum Flag
	{
		Univ = 1,
		TKB = 2,
		Ichinoya = 4
	}

	private class InoHiro
	{
		public InoHiro()
		{ }
		public NotFlag notflags { get; set; }
		public Flag flags { get; set; }
	}

	static void Main( string[] args )
	{
		InoHiro inohiro = new InoHiro();

		inohiro.notflags = notFlag.TKB | notFlag.Univ;
		inohiro.flags = Flag.TKB | Flag.Univ;

		Console.WriteLine( inohiro.notflags.ToString() );
		Console.WriteLine( inohiro.flags.ToString() ); // Univ = 1, TKB = 2 なので足すと3。だけどFlags属性が指定されてるので数字で出力されない

		Console.WriteLine( "{0}", ( ( notFlag )6 ).ToString() );
		Console.WriteLine( "{0}", ( ( Flag )6 ).ToString() ); // 6 は TKB = 2 と Ichinoya = 4 を足したもの

		Console.ReadKey();
	}
}

実行結果

3
Univ, TKB 
6
TKB, Ichinoya 

いまわからないところ

xsp2のコードを読んでるとこれが使われてるんだけど、「<<」(左シフト演算子)が使われてて、これが何をしているかよくわからない。
オプションをビットの配列みたいにして持っているんだと理解しているんだけど、あってるのかな?とりあえず今から色々調べてみようと思うんですが、んーわからん。わかる方教えてください。

[Flags]
enum Options {
	NonStop = 1,
	Verbose = 1 << 1,
	Applications = 1 << 2,
	AppConfigDir = 1 << 3,
	AppConfigFile = 1 << 4,
	Root = 1 << 5,
	FileName = 1 << 6,
	Address = 1 << 7,
	Port = 1 << 8,
	Terminate = 1 << 9,
	Https = 1 << 10,
	Master = 1 << 11,
	RandomPort = 1 << 12
}