C#枚举,双重先前枚举值

24 浏览
0 Comments

C#枚举,双重先前枚举值

这个问题在其他地方已经有了答案

C#中的[Flags]枚举属性是什么意思?

我遇到了一些看起来很奇怪的事情,但与此同时,我也意识到了一些出于我不知道的原因很有意义。

我有这个枚举:

[Flags] public enum Flags { RemoveQuoteMarks = 1, t1 = 2, t2 = 4, t3 = 8, t4 = 16, t5 = 32, t6 = 64, t7 = 128 }

以前,我没有手动设置枚举值,它们从0开始索引,并且标准地每次增加1,对吧?

我注意到当我尝试使用以下字符串加载并解析它时,会出现奇怪的行为:

string value = "t1, t3, t4, t7";

并使用以下代码进行解析:

Flags flags = (Flags)Enum.Parse(typeof(Flags), value);

结果只是\'t7\',所以我进行了一些研究,并注意到许多其他人使用手动索引,其中每个枚举值都是前一个值的两倍(例如,\'t3 = 8\',\'t4 = 16\'),因此我将此规则应用到我的代码中,它奏效了,我的解析枚举现在显示如下:

t1, t3, t4, t7

正如我所期望的,为什么我必须手动配置我的枚举值呢?

admin 更改状态以发布 2023年5月22日
0
0 Comments

你需要这样做的原因是,标志枚举被表示为二进制数字。每个是2的幂次(1、2、4、8、16等)的值对应于二进制数字中不同的索引:

  • 2 -> 10
  • 4 -> 100
  • 8 -> 1000

这是必要的,这样你才能确定给定值实际上包含了哪些标志。例如,如果你的类有一个枚举值为1110,那么它就有2、4和8的标志值。

如果你使用的值不是2的幂次,c#就不能合理地区分哪些枚举值由你的类的标志表示,在进行按位与&操作时就会出现问题。

0