列挙型を使う
http://blogs.wankuma.com/rti/archive/2007/03/12/66244.aspx
列挙型を使う(その2)
http://blogs.wankuma.com/rti/archive/2007/03/13/66420.aspx
の続きです。
例えば、列挙型をアクセス権限に使用したい場合を考えてみます。
列挙したい項目は、「なし・読込・追加・更新・削除」です。
C# では、次のように定義することは既に述べました。
enum 権限 { なし, 読込, 追加, 更新, 削除 }
しかし、読込と更新のように2つの権限を持つ人がいた場合はどうしましょうか?
「読込と更新」という項目を追加することもできますが、そうすると全ての組み合わせを記述しなければなりません。
そこで、まず各値を2の累乗で指定してみます。
enum 権限 {
なし = 0,
読込 = 1,
追加 = 2,
更新 = 4,
削除 = 8
}
こうすることで「読込と更新」の値は、1 + 4 = 5 と表せることになります。
逆に 5 は、必ず 1 + 4 の組み合わせによるということになります。
従って、5 という値だけで、1(読込) と 4(更新) の権限を持つことを表すことができます。
これは、全ての権限の組み合わせに有効な方法です。
しかし、列挙型には 5 という値は定義されていません。
以下の C# のコードを使って実行してみます。
for (int i = 0; i < 16; ++i) {
Console.WriteLine( "{0} : {1}", i, ((権限)i).ToString());
}
すると、予想通り以下のように出力ウィンドウに表示されます。
0:なし
1:読込
2:追加
3:3
4:更新
5:5
6:6
7:7
8:削除
9:9
10:10
11:11
12:12
13:13
14:14
15:15
では、どうすれば組み合わせた数値の結果によって、対応する権限を取得できるのでしょうか?
その答えが FlagsAttribute 属性です。
列挙型の定義の先頭に[FlagsAttribute]と記述するだけです。
[FlagsAttribute]
enum 権限 {
なし = 0,
読込 = 1,
追加 = 2,
更新 = 4,
削除 = 8
}
試しに、先ほどのコードを再度実行してみると次のように表示される筈です。
0:なし
1:読込
2:追加
3:読込, 追加
4:更新
5:読込, 更新
6:追加, 更新
7:読込, 追加, 更新
8:削除
9:読込, 削除
10:追加, 削除
11:読込, 追加, 削除
12:更新, 削除
13:読込, 更新, 削除
14:追加, 更新, 削除
15:読込, 追加, 更新, 削除
そんな訳で、某有名人Jねっとさんからの「まだぁ」という一言によって、
予定を変更
して FlagsAttribute ネタをお送りしました。