为了在显示新闻故事的方法上允许不同的格式化选项,我创建了一个枚举,可以传入以指定它的显示方式.
[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("", UrlEncode(newsStory["NewsStoryID"].ToString())); } // Etc etc... } // So to call the method... Response.Write( FormatNews( news, NewsStyle.Date | NewsStyle.Text ) );
问题是,如果我手动指定枚举上的值,我只能使代码工作,否则按位枚举检查操作无法正常工作.
我一直遵循let .net的规则来处理为枚举赋值 - 这是一个天才的例外吗?
是的,这是一个真正的例外.默认情况下,枚举从0开始分配值,每个值都比前一个值高1,无论FlagsAttribute
s是多少.(当然,当您手动指定某些值时,会有更详细的规则 - 请参阅MSDN文档)
虽然让一个标志枚举自动获得2的幂值有些意义,但我看到为什么最好不这样做的原因:
有这样的枚举是完全合理的:
[Flags] enum Foo { None, Bar, Baz, BarAndBaz }
这当然要求值为0,1,2和3是明智的.
让一个纯属性的存在改变一段C#代码的整个含义是非常反直觉的.考虑我的Foo
示例枚举.是否应该Flags
通过静默更改枚举器值来删除属性来破坏代码?