将FlagsAttribute与超长枚举一起使用

本文关键字:一起 枚举 FlagsAttribute | 更新日期: 2023-09-27 18:28:35

FlagsAttribute类的预期用途是允许枚举用作标志。。。

[Flags]
enum Color
{
    None = 0,
    Red = 1,
    Green = 2,
    Blue = 4
}

请注意,数值呈指数级增长,以允许组合(即3 == Red | Green

假设我有一个包含100个不同值的枚举。。。在最大值甚至不适合ulong的情况下,我如何适应这一点?

将FlagsAttribute与超长枚举一起使用

使用枚举以外的东西。一个有多个标志的结构可以枚举,甚至只包含int。您可以将字段设置为私有字段,并将选项列表设置为一组静态只读字段。只要添加你想要的运算符和方法,你就可以开始了。

C#的标志枚举无论如何都不太擅长它们所做的事情(HasFlag导致了一个分配,例如:为什么Enum';s HasFlag方法需要装箱?)。当您自己制作枚举类型的替代方案时,您可以更高效、更通用地实现自己的等效方法。

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二进制维度的颜色空间。对于颜色,您不需要标志枚举,只需要一个普通枚举(如果您想要一组预定义的颜色),或者如果您想要任何自定义颜色,则需要类似于具有红绿色和蓝色值的结构的枚举。