c# - .net FlagsAttribute 枚举是否需要手动赋值?

标签 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 ) );

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

我一直遵循让 .net 处理枚举赋值的规则 - 这是一个真正的异常吗?

最佳答案

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

虽然让标志枚举自动获取 2 的幂值确实有些有意义,但我明白为什么最好不要这样做的原因:

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

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

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

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

关于c# - .net FlagsAttribute 枚举是否需要手动赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1607442/

相关文章:

c# - 枚举是去这里的正确方法吗?

php - MySQL枚举删除反斜杠

通过枚举快速递增

c# - 在 .NET/C# 中绘制 SVG?

c# - 从 app.config 中的值创建 map

c# - 使用 Net Core 2 的 JWT 远程身份验证错误

c# - WPF Application是否需要继承System.Windows.Application基类?

c# - Web Api,如何从 HttpResponseMessage 返回枚举文本值而不是枚举索引值

c++ - 更新版本化的 .NET 程序集引用

c# - 旋转像素阵列的好方法是什么?