为了允许在显示新闻故事的方法上使用不同的格式选项,我创建了一个可以传入的枚举来指定它的显示方式。
[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 处理枚举值分配的规则 - 这是一个真正的例外吗?
是的,这是一个真正的例外。枚举默认从 0 开始分配值,每个值都比前一个值高 1,无论任何值FlagsAttribute
s。 (当然,当您手动指定某些值时,还有更详细的规则 - 请参阅MSDN 文档)
虽然它确实如此somewhat让标志枚举自动获取二次方的值是有意义的,我明白为什么最好不要这样做的原因:
有一个这样的枚举是完全合理的:
[Flags]
enum Foo
{
None,
Bar,
Baz,
BarAndBaz
}
当然,这需要值为 0、1、2 和 3 才合理。
让一个属性的存在改变一段 C# 代码的全部含义是非常违反直觉的。考虑我的Foo
示例枚举。应删除Flags
属性是否可以通过默默更改枚举值来破坏代码?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)