枚举和常量。什么时候使用?

我阅读了一些有关枚举的内容,发现它们与声明常量非常相似。我怎么知道什么时候使用常量而不是枚举,反之亦然。使用枚举有哪些优点?

88299 次浏览

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

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

I use an enum any place where you could have a number of options and want to improve readability of the code. i.e. you could have trace levels as an int with values 0, 1, 2 or as an enum as error, warning and info.

Enum 还可以用作位运算符,即 FontStyle。粗体字 | FontStyle。斜体会给你粗体和斜体字体。

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

public enum Colour
{
White,
Red,
Blue
}

或者一系列可能的事情,比如: (Example I stole from 给你 as I'm lazy)

[FlagsAttribute]
enum DistributedChannel
{
None = 0,
Transacted = 1,
Queued = 2,
Encrypted = 4,
Persisted = 16,
FaultTolerant = Transacted | Queued | Persisted
}

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

其他需要考虑的因素包括:

  • A: 常量不一定表示常量之间的关系,而枚举表示某个东西可以是枚举定义的集合之一。
  • B: 定义的枚举在用作参数时可以帮助您进行类型检查。常量只是值,所以它们不会提供任何额外的语义信息。

除了罗伯特的回答:

  1. 对一组有限的命名值使用枚举。您实际上并不关心每个符号背后的数值(但是您仍然可以将它们强加于人,例如为了与遗留系统兼容)。

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

C # 常量类似于变量,因为它为值提供定义的名称。但是,常数不同于标准变量,因为一旦定义,分配给常数的值永远不能更改。常量的主要好处是它们有助于创建自我记录的代码,以及允许在单个位置声明键值,这样在需要更新值和重新编译软件时便于维护。

Whereas Enumerator lists are useful for defining sequences and states, particularly when there is a natural progression through those states. This is because each constant in the list can be formatted and compared using either its name or value. An enum can also be used to define a limited set of valid values.

What's missing from the other answers is that enums have an integer base type. You can change the default from int to any other integral type except char like:

enum LongEnum : long {
foo,
bar,
}

You can cast explicitly from and implicitly to the the base type, which is useful in switch-statements. Beware that one can cast any value of the base type to an enum, even if the enum has no member with the appropriate value. So using always the default section in a switch is a good idea. BTW, .NET itself allows even floating point valued enums, but you can't define them in C#, although I think you can still use them (except in switch).

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

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

如果常量 A 只能进入 a,常量 B 只能进入 b,那么在编译过程中使用两种不同的枚举类型将会发现任何错误。

在使用 enum而不是 const时,我发现一件很方便的事情,那就是您可以遍历 enum中的值,而使用 const值做到这一点要困难得多。

如果需要基于整数的值,请使用枚举。 如果需要基于字符串的值,请使用带常量的结构。

当你有一些像

class x
{
public string string_value {get;set;}
publi int int_value  {get;set;}
}


x model = new x();
model.string_value  = struct.some_value;
model.int_value = enum.some_value;

如果您有一组预定义的选项,而这些选项不应该更改(例如,添加更多选项等) ,则使用枚举,否则就会产生常量。

考虑以下几点:

public class Math
{
enum Command {none = 0, add =1, subtract = 2}
const int none =0, add=1,subtract =2;
public virtual int Operate(int a, int b, Command command)
{
if (command == Command.add) return a+b;
if(command == Command.subtract) return a-b;
return a;
}
public virtual int Operate(int a, int b, int command)
{
if (command == add) return a+b;
if(command==subtract) return a-b;
return a;
}
}`


class Math1: Math
{
public override Operate(int a, int b, int command)
{
if(command<3) return base.Operate(a, b, command)
if(command =3) return a*b;
if(command==4) return a/b;
return a;
}
}

因此,使用 const可以允许您传递未在 const声明中定义的参数值,即。3表示乘法,4表示除法。这是好是坏取决于您的逻辑,有时允许用户传递任意值并接收意外结果是不明智的。