【问题标题】:Do .net FlagsAttribute enums need to be manually valued?.net FlagsAttribute 枚举是否需要手动赋值?
【发布时间】:2009-10-22 14:02:03
【问题描述】:

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

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

问题是我只有手动指定枚举值才能让代码工作,否则按位枚举检查操作无法正常工作。

我一直遵循让 .net 处理向枚举分配值的规则 - 这是一个真正的例外吗?

【问题讨论】:

    标签: c# .net enums bit-manipulation


    【解决方案1】:

    是的,这是一个真正的例外。默认情况下,枚举从 0 开始分配值,每个值都比前一个值高 1,而不管任何FlagsAttributes。 (当你手动指定一些值时,当然有更详细的规则——参见MSDN docs

    虽然 在某种程度上 让标志枚举自动获取 2 的幂的值是有意义的,但我明白为什么最好不要这样做的原因:

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

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

    这当然要求值是 0、1、2 和 3 才合理。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多