枚举和常量.哪个用的?

Dra*_*aco 91 c# language-agnostic enums

我正在对枚举进行一些阅读,发现它们与声明常量非常相似.我怎么知道何时使用常量而不是枚举,反之亦然.使用枚举有哪些优点?

And*_*ett 87

如果要定义某些值可以使用的值,请使用枚举.颜色是一个明显的例子,如:

public enum Colour
{
    White,
    Red,
    Blue
}
Run Code Online (Sandbox Code Playgroud)

或者也许是一系列可能的事情:(例如我从这里偷走,因为我很懒)

[FlagsAttribute]
enum DistributedChannel
{
  None = 0,
  Transacted = 1,
  Queued = 2,
  Encrypted = 4,
  Persisted = 16,
  FaultTolerant = Transacted | Queued | Persisted
}
Run Code Online (Sandbox Code Playgroud)

常量应该是单个值,如PI.没有一系列PI值,只有PI.

  • 为什么你不能只拥有一个带有恒定颜色的静态类 Color 而不是 enum ?有什么不同? (3认同)
  • 如果您最终在枚举上大量使用“.ToString()”,使用具有常量字符串的类的任何值看起来和行为都像枚举,但绕过了对“ToString()”的调用,该怎么办?[示例](https://hastebin.com/exehipiwut.cs) (2认同)

Joh*_*nes 28

其他答案缺少的是枚举有一个整数基类型.您可以将默认值从int更改为除char之外的任何其他整数类型:

enum LongEnum : long {
    foo,
    bar,
}
Run Code Online (Sandbox Code Playgroud)

您可以显式地和隐式地转换为基类型,这在switch语句中很有用.请注意,即使枚举没有具有适当值的成员,也可以将基类型的任何值强制转换为枚举.因此,始终使用开关中的默认部分是个好主意.BTW,.NET本身甚至允许浮点值枚举,但你不能用C#定义它们,虽然我认为你仍然可以使用它们(交换机除外).

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

void method(int a, int b) {...}
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*ean 20

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

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

我在任何可以提供多种选项的地方使用枚举,并希望提高代码的可读性.即,您可以将跟踪级别设置为值为0,1,2的int或作为错误,警告和信息的枚举.

Enum还可以用作按位运算符,即FontStyle.Bold | FontStyle.Italic会为您提供粗体和斜体字体.


Ser*_*ier 8

除了罗伯特的回答:

  1. 将枚举用于一组有限的命名值.您并不真正关心每个符号背后的数值(但您仍然有能力强加它们,例如,为了与遗留系统兼容).

  2. 罗伯特:是的,Enum可以用作位字段.使用Flags属性(并确保枚举的成员具有合适的数值).


Bac*_*ave 5

enum我发现使用代替时方便的一件事const是您可以迭代 an 中的值enum,使用值来做到这一点要困难得多const