Dot-Net
.NET:字元串鍵的切換與字典
我有一個業務對象,其中包含大約 15 個不同類型的屬性。業務對像還必須實現具有以下方法的介面:
object GetFieldValue(string FieldName);我可以看到兩種實現此方法的方法:
使用 switch 語句:
switch ( FieldName ) { case "Field1": return this.Field1; case "Field2": return this.Field2; // etc. }使用字典(SortedDictionary 還是 HashTable?):
return this.AllFields[FieldName];哪個效率更高?
**補充:**忘記說了。此方法用於在網格中顯示項目。網格將為這些屬性中的每一個提供一列。通常會有超過 1000 個項目的網格。這就是我關心性能的原因。
添加2:
這是一個想法:混合方法。製作一個靜態字典,其中鍵是屬性名稱,值是數組中的索引。字典僅在應用程序啟動時填寫一次。每個對象實例都有一個數組。因此,查找將如下所示:
return this.ValueArray[StaticDictionary[FieldName]];字典填充算法可以使用反射。然後將相應地實現屬性本身:
public bool Field1 { get { object o = this.ValueArray[StaticDictionary["Field1"]]; return o == null ? false : (bool)o; } set { this.ValueArray[StaticDictionary["Field1"]] = value; } }任何人都可以看到這有什麼問題嗎?
還可以更進一步,可以將 ValueArray/StaticDictionary 放置在單獨的泛型類型
ValueCollection<T>中,其中T將指定反射的類型。ValueCollection 也將處理尚未設置值的情況。然後屬性可以簡單地寫成:public bool Field1 { get { return (bool)this.Values["Field1"]; } set { this.Values["Field1"] = value; } }最後,我又開始懷疑,如果一個簡單的 switch 語句可能不會更快更容易維護……
switch: good efficiency, least maintainable dictionary: good efficiency, better maintainability reflection: least efficient, best maintainability提示:忽略效率並只擔心可維護性,除非您實際測試過性能並發現這是一個問題。
我並不是說反射是您唯一的選擇,只是它允許您根據需要添加/刪除和重命名屬性,並且不需要保持 switch 語句或字典同步。
因為您使用的是字元串 Dictionary 可能會更快。使用字元串時,Switch 本質上會被轉換為雜湊表。但是,如果您使用的是整數或類似的東西,它會被轉換為跳轉表並且會更快。
有關更多詳細資訊,請參閱此答案和問題
最好的辦法是對其進行分析並確定