默认情况下,如果未分配Enum值,则编译器会自动使用基于零的索引进行分配:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
将二进制值分配给Enum成员可以进行逐位操作,并且可以通过按2:的数量级对值进行排序来分配二进制值
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
或者,更方便的是,进行逐位转换:
[Flags]
public enum MyColors
{
Yellow = 0,
Green = 0 << 0,
Red = 0 << 1,
Blue = 0 << 2
}
但是,如果我现在想将橙色添加到黄色和绿色之间的列表中,同时保持值编号的美观性和一致性,该怎么办?这就是预期结果:
[Flags]
public enum MyColors
{
Yellow = 0,
Orange = 0 << 0
Green = 0 << 1,
Red = 0 << 2,
Blue = 0 << 3
}
正如你所看到的,我不得不手动编辑橙色之后的轮班操作,以保持编号的美观和一致性。对于非常大的枚举,这可能会很快变得麻烦。这不是Microsoft Word,您可以在编号列表中插入新项目,并在插入项目后自动更新列表编号。但如果有这样的功能,那就太好了。
这个问题是由于必须手动将Enum值指定为二进制序列而产生的,因为默认情况下Enum成员是以十进制编号的。
所以,我的问题是,是否可以更改默认的编译器行为,使用二进制序列逻辑而不是默认的十进制逻辑将值分配给Enum成员?我正在使用Visual Studio进行编码,以备不时之需。
免责声明:我完全知道Enum中项目的顺序在大多数情况下并不重要,成员值的分配也不重要,这意味着我可以在底部插入Orange,跳过编辑其余成员值的操作,或者在我想要的地方插入Orange。但在某些情况下,新插入的成员在哪里有点重要(例如,当通过反射打印Enum成员名称时(,并且在没有任何顺序的情况下对值进行编号会使按顺序确定新成员的值变得困难。这就是为什么我不想完全指定这些二进制值,而是让编译器自动分配它们。
也许visual studio的扩展可以帮助您。https://marketplace.visualstudio.com/items?itemName=VictorCherniavsky.EnumComposerVSIX基于文档,它使用指定的数据库查询生成枚举。所以您可以在专用数据库表中管理您的标志,然后在构建之前重新生成枚举。
另一个选项是将标志值设置为二进制文字
[Flags]
public enum MyColors
{
None = 0b000000,
Green = 0b000001,
Red = 0b000010,
Blue = 0b000100,
Yellow = 0b001000,
}
为了检查重复,我建议使用一些分析器,例如Roslynator。
答案很简单:不,不可能以这种方式改变C#编译器的行为