2009-03-05 110 views
67

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

+0

另请参阅http://stackoverflow.com/questions/755685/c-static-readonly-vs-const – 2014-12-15 15:36:36

+0

另请参阅http://stackoverflow.com/questions/11575376/why-use-enums-instead-of Java的类似问题的常量(答案大多也适用于C#)。 – 2015-08-08 21:09:44

回答

68

当您想要定义某些可能的值的范围时使用枚举。颜色就像是一个明显的例子:

public enum Colour 
{ 
    White, 
    Red, 
    Blue 
} 

或许就像一组可能的事情: (例子,我从here偷因为我懒)

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

常量应该是一个单一的价值,像PI一样。没有一系列的PI值,只有PI。

+0

如果你最终在enum上使用`.ToString()`,那么在使用一个类似于一个枚举但看起来和行为像一个枚举的类的任何值时,会绕过对`ToString()`的调用? [示例](https://hastebin.com/exehipiwut.cs) – Sinjai 2018-01-29 00:28:01

16

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

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

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

Enum也可以用作按位运算符,即FontStyle.Bold | FontStyle.Italic会给你粗体和斜体字体。

5

除了罗伯特的回答是:

  1. 为一组有限的命名值的使用枚举。你并不关心每个符号背后的数值(但你仍然有能力施加这些数值,例如为了与遗留系统兼容)。

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

3

C#常量类似于一个变量,因为它给一个值定义了一个名称。但是,常数与标准变量不同,因为一旦定义,赋值给常量的值永远不会改变。常量的主要好处是它们可以帮助创建自我记录代码,并允许在一个地方声明关键值,如果需要更新值并重新编译软件,则可以轻松进行维护。

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

22

其他答案中缺少的是枚举有一个整数基类型。您可以从int到任何其他整数类型,除了像炭更改默认:

enum LongEnum : long { 
    foo, 
    bar, 
} 

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

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

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

如果常数A仅可以进入和常数B仅可以进入B,然后用两种不同的枚举类型将揭开编译期间的任何误操作。

相关问题