关于c#:枚举和常量。

Enums and Constants. Which to use when?

我在做一些关于枚举的阅读,发现它们非常类似于声明常量。我如何知道何时使用常量而不是枚举,反之亦然。使用枚举的一些优点是什么?


如果要定义某个值的范围,请使用枚举。颜色是一个明显的例子,比如:

1
2
3
4
5
6
public enum Colour
{
    White,
    Red,
    Blue
}

或者一组可能的事情,比如:(例如,我因为懒惰而从这里偷东西)

1
2
3
4
5
6
7
8
9
10
[FlagsAttribute]
enum DistributedChannel
{
  None = 0,
  Transacted = 1,
  Queued = 2,
  Encrypted = 4,
  Persisted = 16,
  FaultTolerant = Transacted | Queued | Persisted
}

常量应该是单个值,比如pi。没有π值的范围,只有π。


其他答案中缺少的是枚举具有整数基类型。可以将默认值从int更改为除char之外的任何其他整型,例如:

1
2
3
4
enum LongEnum : long {
    foo,
    bar,
}

可以显式地从基类型强制转换并隐式转换为基类型,这在switch语句中很有用。注意,即使枚举没有具有适当值的成员,也可以将基类型的任何值强制转换为枚举。因此,最好始终使用开关中的默认部分。顺便说一句,.NET本身甚至允许浮点值枚举,但您不能在C中定义它们,尽管我认为您仍然可以使用它们(开关中除外)。

此外,使用Enums可以提供更多的类型安全性。如果您打算使用例如int常量作为方法参数,那么我可以使用任何int值调用该方法。当然,通过强制转换,也可以使用枚举,但不会意外发生。更糟糕的是可能混淆参数的顺序。

1
void method(int a, int b) {...}

如果常量a只能进入a,而常量b只能进入b,那么使用两种不同的枚举类型将发现编译期间的任何误用。


常量是一种语言特性,它表示在枚举是特定类型的情况下,变量不会改变值(因此编译器可以围绕该知识进行优化)。

常量可以是任何数据类型,但枚举是枚举。

我在任何地方使用枚举,在这里您可以有许多选项,并希望提高代码的可读性。也就是说,可以将跟踪级别设置为int,值为0、1、2,或者将枚举设置为error、warning和info。

枚举还可以用作按位运算符,即fontStyle.bold fontStyle.italic将为您提供粗体和斜体字体。


除了罗伯特的回答:

  • 对有限的命名值集使用枚举。您并不真正关心每个符号后面的数字值(但是您仍然可以强制它们,例如为了与遗留系统的兼容性)。

  • 罗伯特:是的,枚举可以用作位字段。使用flags属性(并确保枚举成员具有适当的数值)。


  • C常量类似于变量,因为它为一个值提供一个定义的名称。但是,常量不同于标准变量,因为一旦定义了常量,就无法更改分配给该常量的值。常量的主要好处是帮助创建自记录代码,并允许在单个位置声明键值,这样在需要更新值和重新编译软件时可以方便地维护。

    而枚举器列表对于定义序列和状态很有用,特别是在这些状态中有自然的进展时。这是因为列表中的每个常量都可以使用其名称或值进行格式化和比较。枚举还可用于定义一组有限的有效值。


    当使用enum而不是const时,我发现有一件事很方便,那就是您可以迭代enum中的值,使用const值很难做到这一点。