【发布时间】:2012-01-31 09:55:43
【问题描述】:
是否有令人信服的理由在常规枚举的 HashSet 上使用 Flags 枚举(即位掩码)?据我所知,两者都解决了同样的问题:
enum Color { Red, Green, Blue }
[Flags()]
enum Colors { None = 0, Red = 1, Green = 2, Blue = 4 }
void Test()
{
// initialization
var supportedColors1 = new HashSet<Color> { Color.Red, Color.Green };
var supportedColors2 = Colors.Red | Colors.Green;
// comparison
if (supportedColors1.Contains(Color.Green)) { /* ... */ }
if ((supportedColors2 & Colors.Green) != 0) { /* ... */ }
// manipulation
supportedColors1.Remove(Color.Red);
supportedColors2 ^= Colors.Red; // if I'm sure that Red is contained
supportedColors2 &= ~Colors.Red; // if I'm not sure
}
这可能是一个品味问题,但对于没有硬件或系统级位翻转背景的人(= 我的同事),我认为 Set 选项更具可读性。当需要微优化(更好的性能、更少的内存)或 P/Invoking Windows API 时,我可以看到 Flags 选项的优势,但对于标准的业务线数据库应用程序,我很想选择 Set 选项为了可读性。
Flags 选项是否有一些我遗漏的优点,并且可以证明在“常规”代码中使用它是合理的?
【问题讨论】:
标签: c# .net coding-style enums