我在做一些关于枚举的阅读,并发现它们与声明常量非常相似。我怎么知道什么时候使用常量而不是枚举,反之亦然。使用枚举有哪些优点?枚举和常量。哪个使用时?
回答
当您想要定义某些可能的值的范围时使用枚举。颜色就像是一个明显的例子:
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。
如果你最终在enum上使用`.ToString()`,那么在使用一个类似于一个枚举但看起来和行为像一个枚举的类的任何值时,会绕过对`ToString()`的调用? [示例](https://hastebin.com/exehipiwut.cs) – Sinjai 2018-01-29 00:28:01
常量是一种语言特性,它表示变量不会改变值(因此编译器可以对该知识进行优化),其中枚举是特定类型。
常量可以是任何数据类型,但枚举是一个枚举。
我使用枚举任何地方,你可以有多个选项,并希望提高代码的可读性。即您可以将跟踪级别作为值为0,1,2的int或作为错误,警告和信息的枚举。
Enum也可以用作按位运算符,即FontStyle.Bold | FontStyle.Italic会给你粗体和斜体字体。
除了罗伯特的回答是:
为一组有限的命名值的使用枚举。你并不关心每个符号背后的数值(但你仍然有能力施加这些数值,例如为了与遗留系统兼容)。
Robert:是的,Enum's可以用作位域。使用Flags属性(并确保枚举的成员具有合适的数值)。
C#常量类似于一个变量,因为它给一个值定义了一个名称。但是,常数与标准变量不同,因为一旦定义,赋值给常量的值永远不会改变。常量的主要好处是它们可以帮助创建自我记录代码,并允许在一个地方声明关键值,如果需要更新值并重新编译软件,则可以轻松进行维护。
尽管枚举器列表对于定义序列和状态非常有用,特别是当通过这些状态有自然进展时。这是因为列表中的每个常量都可以使用其名称或值进行格式化和比较。枚举也可以用来定义一组有限的有效值。
其他答案中缺少的是枚举有一个整数基类型。您可以从int到任何其他整数类型,除了像炭更改默认:
enum LongEnum : long {
foo,
bar,
}
您可以显式转换和隐式的基本类型,这是在开关语句是有用的。请注意,即使枚举没有具有适当值的成员,也可以将任何基类型的值转换为枚举。因此,在交换机中始终使用默认部分是个不错的主意。顺便说一句,.NET本身甚至允许浮点值枚举,但你不能用C#定义它们,尽管我认为你仍然可以使用它们(除了在switch中)。
此外,使用枚举为您提供更多的类型安全性。如果您打算使用例如int常量作为方法参数,然后我可以用任何int值调用该方法。当然,通过投射也可以发生枚举,但它不会意外发生。更糟的是可能会混淆参数的顺序。
void method(int a, int b) {...}
如果常数A仅可以进入和常数B仅可以进入B,然后用两种不同的枚举类型将揭开编译期间的任何误操作。
- 1. 枚举和常量
- 2. 枚举常量
- 3. 使用switch语句常量或枚举? (哪个更好)? C#
- 4. 为什么Phobos使用枚举常量?
- 5. 动态加载Java枚举类和枚举常量
- 6. 使用属性以减少枚举枚举映射和枚举/常量行动开关statments
- 7. MSVC常量枚举类型
- 8. 常量枚举(tsc.js VS typescript.js)
- 9. Grails:java.lang.IllegalArgumentException:没有枚举常量
- 10. 没有枚举常量org.primefaces.extensions.component.exporter.DefaultExporterFactory.ExporterType.CSV
- 11. 全局常量与枚举
- 12. 为什么使用字符串常量与枚举常量?
- 13. 使用枚举作为常量表达式。哪个编译器是正确的?
- 14. Xtext交叉引用枚举的常量
- 15. 了解枚举 - 用作常量
- 16. 枚举不能用于固定常量?
- 17. 如何使用金额枚举(在组中生成)枚举常量
- 18. 在Java中,为什么可以用另一个枚举常量限定枚举常量?
- 19. 在哪里可以使用枚举和如何模拟messageboxICon枚举
- 20. 接通枚举在Java中:不合格的枚举常量
- 21. MYSQL - 哪个枚举执行更好的枚举('Y','N')或枚举('1','0')
- 22. 如何从第一个匹配枚举类型获得枚举常量
- 23. 如何使用/分开量角器中的枚举,常量和定位器
- 24. 枚举:使用枚举和类与静态变量之间的区别
- 25. 在Java中,何时调用枚举常量的构造函数?
- 26. 使用枚举
- 27. 变量指向一个枚举或另一个枚举?
- 28. 警告:左说不枚举常量javafx.geometry.Pos.LEFT
- 29. Java枚举与字符串常量
- 30. Java - 重命名枚举常量
另请参阅http://stackoverflow.com/questions/755685/c-static-readonly-vs-const – 2014-12-15 15:36:36
另请参阅http://stackoverflow.com/questions/11575376/why-use-enums-instead-of Java的类似问题的常量(答案大多也适用于C#)。 – 2015-08-08 21:09:44