.net FlagsAttribute枚举是否需要手动估值?

时间:2009-10-22 14:02:03

标签: c# .net enums bit-manipulation

为了在显示新闻报道的方法上允许不同的格式化选项,我创建了一个可以传入的枚举,以指定它的显示方式。

[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 ) );

问题是,如果我在枚举上手动指定值,我只能使代码工作,否则按位枚举检查操作无法正常工作。

我一直遵循let .net的规则处理为枚举值赋值 - 这是一个天才的例外吗?

2 个答案:

答案 0 :(得分:8)

是的,这是一个真正的例外。默认情况下,枚举从0开始分配值,每个值都比前一个值高1,无论任何FlagsAttribute s。 (当然,当您手动指定某些值时,会有更详细的规则 - 请参阅MSDN docs

虽然有点有意义让标志枚举自动获得2的幂值,但我看到为什么最好不要这样做的原因:

这样的枚举是完全合理的:

[Flags]
enum Foo
{
    None,
    Bar,
    Baz, 
    BarAndBaz
} 

这当然要求值为0,1,2和3是合理的。

让一个纯属性的存在改变一段C#代码的整个含义是非常反直觉的。考虑我的Foo示例枚举。是否应该通过静默更改枚举器值来删除Flags属性来破解代码?

答案 1 :(得分:0)

是的,您必须在Enum中指定值以使添加的标志值正常工作(以便能够组合两个枚举标志,并且不会将该值与指定的另一个标志冲突)。您不必指定值来进行编译,但结果很可能不是您要查找的结果。