2012-11-15 77 views
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 
} 

现在,在这里我左右为难我有点是否我应该有一个枚举里面那些专业或seperately申报。从第一眼看来,感觉就像我应该使用枚举,因为它只是“一件事物可以是其中之一”的情况,但另一方面,事实证明,如果我使用枚举,那么我将不得不将它投射到获得其内部价值。这里有一个例子:

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

我不知道,也许有投枚举是一个完全正常的做法,由程序员被广泛使用,但我认为它会影响性能(无论是明显与否)

回答

2

我会用方法DisplaySkills它接受枚举作为参数去。只有在调用存储过程时才执行投射。

因为当看到DisplaySkills(int speciality)再有就是在一些枚举声明专业没有任何关系。也许我应该用这种方式?

DisplaySkills(500); 

在另一方面:

DisplaySkills(Speciality.Neurologist); 

它告诉我有关的所有可能的参数值。另外我会改名为DisplaySkillsOf(Speciality.Cardiologist) - 看起来更像英语句子。我添加了guard condition来检查包含在Speciality enum中的传递值。否则有人可以做到这一点

DisplaySkills((Speciality)500); 

而且只有这个方法里面你转换通过枚举创建参数(看起来像您使用ADO时为int。NET)为您的方法创建后卫

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

一个提示。您可以使用generic enum wrapper检查是否适当的值传递

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

我完全同意将上述方法传递给任何整数的可能性,并将名称更改为更像英语。 –

+0

而且,如果想让常量不是整型而是字符串呢?枚举仍然可以用于这个目的,或者常量是唯一的方法吗? –

+0

@MikeJM唯一的整数值类型可以用作枚举值。但是你可以稍后使用枚举的常量名,或者写一个简单的转换器 –

1

我应该用我到时候会需要它们的内在价值

在你的情况,我会选择在enum常量域枚举或只是单独的常量。

也许具有投枚举是完全正常的实践。

是。它是。

1

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

+0

什么是你通过INT +字符串值是什么意思?你的意思是字符串或字符串的整数值的名称也可以是内部值? –

1

如果你担心铸造然后让我告诉你它在这里不需要你可以使用这个

int value = Speciality.Cardiologist.GetHashCode(); 
+0

是的,我知道,但是当我用常量说特殊性,心脏病专家时,这是一个额外的步骤。所以你说这绝对没问题? –

相关问题