【问题标题】:Should I use enums or just seperate constants where I'll need their internal values我应该使用枚举还是只在需要它们内部值的地方使用单独的常量
【发布时间】:2012-11-03 19:31:45
【问题描述】:

让我用医生来解释我的问题。现在医生有不同的专业领域,例如神经科医生=0,肿瘤科医生=1,心脏病科医生=2,妇科医生=3 等。假设我有一种方法,将这些专业之一作为整数并将其用作存储的参数数据库中的过程:

DisplaySkills(int speciality)
{
   //create a connection to a database, refer to a stored procedure in the database;
   //send "speciality" as an argument to that stored procedure
}

现在,我有点进退两难,我应该在枚举中包含这些专业还是单独声明它们。乍一看,我觉得我应该使用枚举,因为这只是“一个事物可以是多个事物中的一个”的情况,但另一方面事实证明,如果我使用枚举,那么我将不得不将其转换为得到它的内在价值。这是一个例子:

enum Speciality
{
  Neurologist=0,
  Oncologist=1,
  Cardiologist=2,
  Gynecologist=3
}
.............
Speciality spec=Speciality.Oncologist;
.............
DisplaySkills(int(spec));

我不知道,也许必须强制转换枚举是一种完全正常的做法,并且被程序员广泛使用,但我认为它会影响性能(无论是否明显)

【问题讨论】:

    标签: c# enums constants


    【解决方案1】:

    我会使用方法DisplaySkills,它接受枚举作为参数。仅在调用存储过程时进行强制转换。

    因为什么时候看到DisplaySkills(int speciality) 那么与某些枚举中声明的专业没有联系。也许我应该这样使用它?

    DisplaySkills(500);
    

    另一方面:

    DisplaySkills(Speciality.Neurologist);
    

    它告诉我所有可能的参数值。此外,我会将名称更改为 DisplaySkillsOf(Speciality.Cardiologist) - 看起来更像是英文句子。我添加了guard condition 来检查Speciality 枚举中包含的传递值。否则有人可以这样做

    DisplaySkills((Speciality)500);
    

    只有在这个方法中,你才能在创建参数时将传递的 enum 转换为 int(看起来你正在使用 ADO.NET)

    cmd.Parameters.Add(new SqlParameter("@Speciality", (int)spec));
    

    关于为您的方法创建守卫的更多提示。您可以使用generic enum wrapper 检查是否传递了适当的值

    if (!Enum<Speciality>.IsDefined(spec))
         throw new ArgumentException("spec");
    

    【讨论】:

    • 我完全同意将任何整数传递给上述方法的可能性以及将名称修改为更像英文。
    • 另外,如果想让常量不是整数类型而是字符串呢?枚举仍然可以用于此目的还是常量是唯一的方法?
    • @MikeJM 只有整数类型可以用作枚举值。但是你可以稍后使用枚举常量的名称,或者编写一个简单的转换器
    【解决方案2】:

    我应该使用枚举还是只在需要它们内部值的地方使用单独的常量

    在你的情况下,我会选择 enum 而不是常量字段。

    也许必须强制转换枚举是一种完全正常的做法。

    是的。它是。

    【讨论】:

      【解决方案3】:

      我建议你使用枚举而不是静态常量类,因为它是Type safe
      经验法则:如果您只有 Int + 字符串值,请使用枚举。如果您有更多字段,请使用静态类。

      【讨论】:

      • int+string 值是什么意思?你的意思是字符串的整数值的名称还是字符串也可以是内部值?
      【解决方案4】:

      如果你担心投射,那么让我告诉你这里不需要你可以使用它

      int value = Speciality.Cardiologist.GetHashCode();
      

      【讨论】:

      • 是的,我知道,但是当使用常量时,我​​只能说 Speciality.Cardiologist,这是一个额外的步骤。所以你说绝对没问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多