我在阅读枚举时发现它们与声明常量非常相似。我怎么知道什么时候使用常量而不是枚举,反之亦然。使用枚举有哪些优点?
我在阅读枚举时发现它们与声明常量非常相似。我怎么知道什么时候使用常量而不是枚举,反之亦然。使用枚举有哪些优点?
Answers:
当您想要定义可以是的值范围时,请使用枚举。颜色是一个明显的例子,例如:
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。
其他要考虑的要点是:
Type Safety"
其他答案缺少的是枚举具有整数基本类型。您可以将默认值从int更改为除char以外的任何其他整数类型,例如:
enum LongEnum : long {
foo,
bar,
}
您可以显式地从基础类型强制转换为隐式基础类型,这在切换语句中很有用。请注意,即使枚举没有具有适当值的成员,也可以将基本类型的任何值强制转换为枚举。因此,始终在开关中使用默认部分是一个好主意。顺便说一句,.NET本身甚至允许浮点值枚举,但是您不能在C#中定义它们,尽管我认为您仍然可以使用它们(在switch中除外)。
此外,使用枚举可提高类型安全性。如果您打算使用例如int常量作为方法参数,那么我可以使用任何int值调用该方法。当然,通过强制转换,它也可以与枚举一起发生,但绝不会偶然发生。更糟的是可能会混淆参数的顺序。
void method(int a, int b) {...}
如果仅常数A可以进入a,常数B只能进入b,那么使用两种不同的枚举类型将发现编译期间的任何误用。
除了罗伯特的回答:
使用enum表示一组有限的命名值。您实际上并不在乎每个符号后面的数值(但是您仍然可以强加它们,例如,为了与旧系统兼容)。
Robert:是的,Enum可以用作位字段。使用Flags属性(并确保枚举的成员具有合适的数值)。
使用enum
而不是时,我发现很方便的一件事const
是,您可以遍历an中的值,enum
而使用const
值很难做到这一点。