为什么我更喜欢枚举到具有常量值的结构

Mik*_*yev 34 c# enums struct

带常量的结构:

public struct UserType
{
  public const int Admin=1;
  public const int Browser=2;
  public const int Operator=3;
}
Run Code Online (Sandbox Code Playgroud)

现在让我们使用枚举来达到同样的目的:

public enum UserType
{
  Admin=1,
  Browser,
  Operator
}  
Run Code Online (Sandbox Code Playgroud)

两者都在堆栈上分配.在这两种情况下,我都会说UserType.Admin.使用struct方法,我不必转换为int来获取底层值.我知道使用枚举版本可以保证三个值中只有一个将被使用,而对于struct版本,任何整数都可以used,表示Int32.MinValue和Int32.MaxValue之间的任何值.除了这个之外,还有其他好处吗?

Jon*_*eet 37

除了这个之外,还有其他好处吗?

明晰.

假设您有一个字段或方法参数,它始终具有这三个值中的一个.如果你把它作为枚举类型,那么:

  • 你不能不小心为它分配一些任意整数值.(您可以故意将任何int值转换为枚举类型,但您必须明确地这样做.)
  • 很清楚这种价值意味着什么样的信息

这些在编写代码时非常重要,将来很容易维护.您可以越多地使代码自然地描述您想要实现的目标,就越好.

  • 你不能称他为"亲爱的约翰"(或许你可以).无论我真正的意思是什么,你知道的更好:http://meta.stackexchange.com/questions/9134/jon-skeet-facts (3认同)
  • 谢谢,亲爱的乔恩。 (2认同)

Mic*_*tum 10

可以从没有反射的字符串或数字中查找枚举,例如

// VERY important when using ORMs, as databases usually use an int
UserType ut = (UserType)2; 

// Useful when parsing config files like appSettings.
UserType utf = (UserType)Enum.Parse(typeof(UserType),"Admin");
Run Code Online (Sandbox Code Playgroud)

框架中还有很多内容可以让Enums更快地进行常见操作.另一件事是FlagsAttribute for Bitfields,使用const int不容易实现.

检查Enum类的成员以获取更多帮助函数,例如GetNames和GetValues.

  • 那么你当然可以*以简单的方式组合const int,例如使用`|`运算符.它只是没有给你愉快的字符串表示.(就个人而言,我认为枚举在.NET中运行的方式有很多问题.它们可以给我们带来比它们更多的好处,但这是另一回事:) (3认同)
  • @Jon确实,不是更好的C枚举,从Java枚举中借更多的东西会带来一些好处.但是,将魔术整数作为一等公民是C#中唯一的枚举. (3认同)