枚举值为0x0001?

Bro*_*ink 5 c# enums

我有这样的枚举声明:

public enum Filter
{
  a = 0x0001;
  b = 0x0002;
}
Run Code Online (Sandbox Code Playgroud)

那是什么意思?他们用它来过滤数组.

Jon*_*eet 10

这意味着它们是分配给这些名称的整数值.枚举基本上只是命名数字.您可以在枚举的基础类型和枚举值之间进行转换.

例如:

public enum Colour
{
    Red = 1,
    Blue = 2,
    Green = 3
}

Colour green = (Colour) 3;
int three = (int) Colour.Green;
Run Code Online (Sandbox Code Playgroud)

默认情况下,一个枚举的基础类型int,但是你可以使用任何的byte,sbyte,short,ushort,int,uint,longulong:

public enum BigEnum : long
{
    BigValue = 0x5000000000 // Couldn't fit this in an int
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用整数(如我的第一个例子所示) - 但你也可以使用十六进制.这只是一个选择. (4认同)
  • 可能没有必要使用Hex,他们可能只是使用hex来让程序员更明显地了解它们的用途. (2认同)

sam*_*moz 7

它只是意味着如果你做Filter-> a,你得到1. Filter-> b是2.

奇怪的十六进制表示法只是表示法.

编辑:由于这是一个'过滤器',十六进制表示法更有意义.

通过写入0x1,指定以下位模式:

0000 0001
Run Code Online (Sandbox Code Playgroud)

而0x2是:

0000 0010
Run Code Online (Sandbox Code Playgroud)

这使得如何使用过滤器更加清晰.

因此,例如,如果要过滤掉设置了较低2位的数据,您可以执行以下操作:

Filter->a | Filter->b
Run Code Online (Sandbox Code Playgroud)

这将对应于:

0000 0011
Run Code Online (Sandbox Code Playgroud)

十六进制表示法使过滤器的概念更清晰(对某些人来说).例如,通过观察它可以相对容易地找出0x83F0的二进制数,但对于33776(基数10中的相同数字)则要困难得多.

  • @RJ - 如果您打算成为一名开发人员,您最好像理解十进制一样轻松理解十六进制表示法. (7认同)
  • @RJ - Greg B是对的.如果你计划成为一名开发人员,你最好理解十六进制表示法(并且八进制不会受到伤害).否则,您永远不会理解或能够调试执行按位逻辑AND,OR,XOR操作的任何代码.您认为这是不必要的,大致相当于要求从C++和C#语言标准中删除这些运算符. (4认同)
  • 不知怎的,这似乎很奇怪:http://thedailywtf.com/forums/47608/ShowPost.aspx (3认同)

Guf*_*ffa 5

不清楚你觉得不清楚的是什么,所以让我们讨论一下:

枚举值已被赋予明确的数值。每个枚举值始终表示为底层存储的数值,但如果您想确定该数值是什么,则必须指定它。

数字以十六进制表示法书写,当您希望数值包含一个用于屏蔽的设置位时,通常会使用这种表示法。与写入 32768 相比,写入 0x8000 时该值仅设置了一位更容易看出。

在您的示例中,它不像您只有两个值那么明显,但是对于位过滤,每个值代表一个位,因此每个值是前一个值的两倍:

public enum Filter {
   First = 0x0001,
   Second = 0x0002,
   Third = 0x0004,
   Fourth = 0x0008
}
Run Code Online (Sandbox Code Playgroud)

您可以使用这样的枚举来过滤掉值中的单个位:

If ((num & Filter.First) != 0 && (num & Filter.Third) != 0) {
   Console.WriteLine("First and third bits are set.");
}
Run Code Online (Sandbox Code Playgroud)