2009-09-16 70 views
1

我需要用一個內部集合對象來定義一個類,以通過一個字符串鍵來保存不同類型的值(比如string,int,float,DateTime和bool)。我可以使用Hashtable,因爲它不是強類型的集合類,而Dictionary則用於強類型的項目(即使我可以使用Dictionary對象)。要使用哪個集合類:散列表或字典?

這是我想我的定義類及其使用情況:

public class MyBaseClass<D> { 
    protected Hashtable ht = new Hashtable(); 

    MyClass public SetValue<T>(string key, T value) 
    { 
     ht.Add(key, value); 
     return this; 
    } 

    public abstract D GetObject(); 
} 

// Example of using the base class for data as class Data1 
public MyClass<Data1> : MyBaseClass<Data1> { 
     public Data1 GetObject() { 
     return new Data1 { 
      Property1 = ht["key1"] as string, 
      Property2 = Int.Parse(ht["key2"].ToString()) 
      } 
} 

有了上面的例子中,我不知道什麼是持有MyBaseClass我的數據最好的收集?我閱讀了一些關於Hashtable的文章。這是一個過時的集合,與Dictionary集合相比,性能要慢得多。我應該使用.Net 3.5中的Dictionary還是其他任何集合?

+1

Dictionary是一個優化的HashTable。我認爲這回答你的問題:) – 2009-09-16 15:31:11

回答

4

你應該總是使用泛型集合,除非有很好的理由不這樣做。這確保了一切都是合理的類型安全,並減少編程錯誤。如果您將值類型存儲在通用字典中,還具有性能優勢;如果你使用Hashtable,每個值類型都必須被裝箱。

但是,您的示例似乎本質上是類型不安全的,並且具有代碼異味。爲什麼你有兩個類型變量來訪問相同的散列表有特定的原因嗎?

9

就我個人而言,我會在這種情況下使用Dictionary<string, object>。 至少這會阻止你嘗試使用非字符串鍵。

我個人停止使用受保護的領域,以及 - 考慮增加一個索引到你的基類與受保護的setter和一個公共的getter:如果你想讓它由缺少訪問返回null

public object this[string key] 
{ 
    get { return ht[key]; } 
    protected set { ht[key] = value; } 
} 

鍵,你應該在吸氣劑中使用TryGetValue。同樣,如果你想重複添加密鑰失敗,你可以在setter中使用Add

+0

實際上在這種情況下,我不在乎null或異常。如果我嘗試獲得尚未設置的值,我想獲得例外。 – 2009-09-16 16:04:09

+0

在這種情況下,我發佈的代碼會很好。如果您使用相同的鍵兩次*設置*它將只覆蓋以前的值。 – 2009-09-16 16:25:12

+0

@Jon Skeet,謝謝你的信息。我可以使用這個覆蓋功能來讀取另一組屬性,然後根據新的設置數據創建一個新的obj。換句話說,我可以在循環或方法調用中重用實例(循環或方法調用有不同的值重複)。 – 2009-09-16 17:13:46

0

我會去字典。我只能想到一個場景,其中一個Hashtable 可能是首選。對於一個作者和多個閱讀器而言,它是線程安全的,無需使用同步機制。但是,這種情況會非常具體而且非常罕見。即使如此,我可能會使用Dictionary來使用所有常規的同步原語。

1

我會用一個字典,但我真的想使我的收藏類型安全的,我可能會實現Item 29 of Effective Java描述的類型安全的異構容器(例子是Java,但應用程序應該爲這兩種語言雖然在細節上下工夫和限制可能不同)。這種技術將值的類型編碼到鍵中。

+0

加1有趣!您評論中的原始鏈接已損壞,但這裏是關於該技術的文章:http://idlebrains.org/tutorials/java-tutorials/effective-java-typesafe-heterogeneous-container-pattern/另外,這裏是書在Amazon上:http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683/ref=sr_1_1?ie=UTF8&qid=1410969528&sr=8-1&keywords=effective+java – Bill 2014-09-17 16:02:32

2

散列表存在於1.1中。字典在2.0版泛型進入之前並不存在。我認爲沒有理由在2.0及更高版本中使用Hashtable - 它本質上是一個硬編碼的字典<字符串,對象>,它可能(可能?)讓ported 1.1代碼工作。

所以,字典應該是你在這裏選擇的對象。