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


94

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



另请参阅stackoverflow.com/questions/11575376/…,以获取有关Java的类似问题(答案也大多适用于C#)。
阿列克谢·莱文科夫2015年

Answers:


95

当您想要定义可以是的值范围时,请使用枚举。颜色是一个明显的例子,例如:

public enum Colour
{
    White,
    Red,
    Blue
}

或者可能是一些可能的事情,例如:(例如,我懒惰地从这里偷了东西)

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

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

其他要考虑的要点是:

  • a:常量不一定表示常量之间的关系,而枚举表示某些东西可以是枚举定义的集合之一。
  • b:定义的枚举用作参数时可以帮助您进行类型检查。常量只是值,因此它们不提供任何其他语义信息。

1
如果最终.ToString()大量使用枚举,在使用带有const字符串的类的类时有什么价值,该字符串的外观和作用类似于枚举,但却绕开了对的调用ToString()示例
Sinjai,

等等,我想我回答了我自己的问题。该示例中的代码不起作用:您必须将输入作为字符串使用,这实际上不会像枚举那样。
Sinjai

1
为什么您不能仅使用具有恒定颜色的静态类Color而不是enum呢?有什么不同?
WDUK

简而言之Type Safety"
ahmednabil88 '19

30

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

enum LongEnum : long {
    foo,
    bar,
}

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

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

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

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


20

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

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

我在任何可以使用许多选项的地方都使用一个枚举,并希望提高代码的可读性。也就是说,您可以将跟踪级别设置为int值0、1、2或将enum作为错误,警告和信息。

枚举也可以用作按位运算符,即FontStyle.Bold |。FontStyle.Italic将为您提供粗体和斜体字体。


8

除了罗伯特的回答:

  1. 使用enum表示一组有限的命名值。您实际上并不在乎每个符号后面的数值(但是您仍然可以强加它们,例如,为了与旧系统兼容)。

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


3

AC#常量与变量类似,因为它为值指定了定义的名称。但是,常量与标准变量不同,因为一旦定义,分配给该常量的值就永远无法更改。常量的主要好处是它们可以帮助创建自文档代码,并允许在单个位置声明键值,这使得在需要更新值和重新编译软件时可以轻松维护。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.