.net FlagsAttribute列挙は手動で評価する必要がありますか?
-
05-07-2019 - |
質問
ニュース記事を表示するメソッドでさまざまなフォーマットオプションを使用できるようにするために、表示方法を指定するために渡すことができる列挙を作成しました。
[Flags]
private enum NewsStyle
{
Thumbnail = 0,
Date = 1,
Text = 2,
Link = 4,
All = 8
}
string FormatNews( DataRow news, NewsStyle style )
{
StringBuilder HTML = new StringBuilder();
// Should the link be shown
if ( ((newsStyle & NewsStyle.All) == NewsStyle.All || (newsStyle & NewsStyle.Link) == NewsStyle.Link))
{
HTML.AppendFormat("<a style=\"text-decoration:none; color: rgb(66, 110, 171);\" href=\"ViewStory.aspx?nsid={0}\">",
UrlEncode(newsStory["NewsStoryID"].ToString()));
}
// Etc etc...
}
// So to call the method...
Response.Write( FormatNews( news, NewsStyle.Date | NewsStyle.Text ) );
問題は、enumの値を手動で指定した場合にのみコードが機能することです。そうしないと、ビット単位のenumチェック操作が正しく機能しません。
私は常に.netに列挙値への値の割り当てを処理させるというルールに従いました-これは本物の例外ですか?
解決
はい、それは真の例外です。列挙型には、デフォルトで0以降の値が割り当てられ、各 FlagsAttribute
に関係なく、それぞれの値は前の値よりも1高くなります。 (もちろん、いくつかの値を手動で指定する場合の詳細なルールがあります&#8211; MSDNドキュメント)
フラグの列挙が自動的に2のべき乗の値を取得することはある程度意味がありますが、おそらくそうしないことが最善の理由がわかります。
次のような列挙型を持つことは完全に合理的です:
[Flags]
enum Foo
{
None,
Bar,
Baz,
BarAndBaz
}
当然、この値は0、1、2、および3が適切である必要があります。
単なる属性の存在によってC#コードの一部の意味全体が変わるようにすることは、直観に反します。 Foo
の列挙の例を考えてみましょう。 Flags
属性を削除しても、列挙子の値を暗黙的に変更することでコードを壊すことができますか?
他のヒント
はい、Enumに値を指定して、追加されたフラグ値が正しく機能するようにする必要があります(2つのenumフラグを組み合わせて、その値が指定された別のフラグと競合しないようにします)。コンパイルするために値を指定する必要はありませんが、結果はおそらく探しているものではありません。
所属していません StackOverflow