2012-11-15 17 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

是的,我知道,但是當我用常量說特殊性,心臟病專家時,這是一個額外的步驟。所以你說這絕對沒問題? –

相關問題