让我用医生来解释我的问题。现在医生有不同的专业领域,如神经病学家= 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));
我不知道,也许不得不演绎枚举是一种非常正常的做法,并且被程序员广泛使用,但我认为它会影响性能(无论是否显着)
答案 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();