我应该使用枚举还是仅使用单独的常量来获取内部值

时间:2012-11-15 07:59:55

标签: c# enums constants

让我用医生来解释我的问题。现在医生有不同的专业领域,如神经病学家= 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));

我不知道,也许不得不演绎枚举是一种非常正常的做法,并且被程序员广泛使用,但我认为它会影响性能(无论是否显着)

4 个答案:

答案 0 :(得分:2)

我选择接受枚举作为参数的方法DisplaySkills。仅在调用存储过程时进行转换。

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

DisplaySkills(500);

另一方面:

DisplaySkills(Speciality.Neurologist);

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

DisplaySkills((Speciality)500);

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

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

关于为您的方法创建警卫的另一个提示。您可以使用generic enum wrapper检查是否已通过适当的值

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

答案 1 :(得分:1)

  

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

在你的情况下,我会在常数字段上选择enum

  

可能不得不施放枚举是一种非常正常的做法。

是。它是。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

int value = Speciality.Cardiologist.GetHashCode();