为了允许在显示新闻故事的方法上使用不同的格式设置选项,我创建了一个可以传入的枚举以指定它的显示方式。
[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/