【发布时间】:2015-12-31 01:08:56
【问题描述】:
FlagsAttribute 类的预期目的是允许将枚举用作标志...
[Flags]
enum Color
{
None = 0,
Red = 1,
Green = 2,
Blue = 4
}
请注意,数值呈指数增长以允许组合(即3 == Red | Green)
假设我有一个包含 100 个不同值的枚举...我如何适应这个最大的值甚至不适合 ulong?
【问题讨论】:
FlagsAttribute 类的预期目的是允许将枚举用作标志...
[Flags]
enum Color
{
None = 0,
Red = 1,
Green = 2,
Blue = 4
}
请注意,数值呈指数增长以允许组合(即3 == Red | Green)
假设我有一个包含 100 个不同值的枚举...我如何适应这个最大的值甚至不适合 ulong?
【问题讨论】:
使用枚举以外的东西。具有多个标志枚举甚至内部只有整数的结构将起作用。您可以将字段设为私有,并将选项列表设为一堆静态只读字段。只需添加您想要的任何运算符和方法,您就可以开始使用了。
C# 的标志枚举无论如何都不是很好(HasFlag 会产生分配,例如:Why Enum's HasFlag method need boxing?)。在为枚举类型创建自己的替代方案时,您可以更有效、更通用地实现自己的等效方法。
struct Color
{
public static readonly Color None = new Color(),
public static readonly Color Red = new Color(1),
public static readonly Color Green = new Color(2),
public static readonly Color Blue = new Color(100)
private int data1;
private int data2;
private Color(int channel){...}
}
值得注意的是,您可能不需要 100 位二进制颜色空间。对于颜色,您不需要标志枚举,只需一个普通枚举(如果您想要一组预定义的颜色)或类似具有红绿色和蓝色值的结构,如果您想要任何自定义颜色。
【讨论】: