我正在对枚举进行一些阅读,发现它们与声明常量非常相似.我怎么知道何时使用常量而不是枚举,反之亦然.使用枚举有哪些优点?
如果要定义某些值可以使用的值,请使用枚举.颜色是一个明显的例子,如:
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.
其他答案缺少的是枚举有一个整数基类型.您可以将默认值从int更改为除char之外的任何其他整数类型:
enum LongEnum : long { foo, bar, }
您可以显式地和隐式地转换为基类型,这在switch语句中很有用.请注意,即使枚举没有具有适当值的成员,也可以将基类型的任何值强制转换为枚举.因此,始终使用开关中的默认部分是个好主意.BTW,.NET本身甚至允许浮点值枚举,但你不能用C#定义它们,虽然我认为你仍然可以使用它们(交换机除外).
此外,使用枚举可以提供更多的类型安全性.如果您打算使用例如int常量作为方法参数,那么我可以使用任何int值调用该方法.当然,通过铸造也可以使用枚举,但不会偶然发生.更糟糕的是混淆参数顺序的可能性.
void method(int a, int b) {...}
如果常量A只能进入a而常量B只能进入b,那么使用两种不同的枚举类型将在编译期间发现任何误用.
常量是一种语言特性,它表示变量不会改变值(因此编译器可以围绕该知识进行优化),其中枚举是特定类型.
常量可以是任何数据类型,但枚举是枚举.
我在任何可以提供多种选项的地方使用枚举,并希望提高代码的可读性.即,您可以将跟踪级别设置为值为0,1,2的int或作为错误,警告和信息的枚举.
Enum还可以用作按位运算符,即FontStyle.Bold | FontStyle.Italic会为您提供粗体和斜体字体.
除了罗伯特的回答:
将枚举用于一组有限的命名值.您并不真正关心每个符号背后的数值(但您仍然有能力强加它们,例如,为了与遗留系统兼容).
罗伯特:是的,Enum可以用作位字段.使用Flags属性(并确保枚举的成员具有合适的数值).