質問

ニュース記事を表示するメソッドでさまざまなフォーマットオプションを使用できるようにするために、表示方法を指定するために渡すことができる列挙を作成しました。

[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フラグを組み合わせて、その値が指定された別のフラグと競合しないようにします)。コンパイルするために値を指定する必要はありませんが、結果はおそらく探しているものではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top