1

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

4 回答 4

2

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

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

DisplaySkills(500);

另一方面:

DisplaySkills(Speciality.Neurologist);

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

DisplaySkills((Speciality)500);

并且仅在此方法中,您在创建参数时将传递的枚举转换为 int(看起来您正在使用 ADO.NET)

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

关于为您的方法创建守卫的另一个提示。您可以使用通用枚举包装器来检查是否传递了适当的值

if (!Enum<Speciality>.IsDefined(spec))
     throw new ArgumentException("spec");
于 2012-11-15T08:04:15.667 回答
1

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

在您的情况下,我将选择enum常量字段。

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

是的。这是。

于 2012-11-15T08:02:12.410 回答
1

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

于 2012-11-15T08:03:00.453 回答
1

如果您担心铸造,那么让我告诉您这里不需要您可以使用它

int value = Speciality.Cardiologist.GetHashCode();
于 2012-11-15T08:03:53.517 回答