Какой класс коллекции использовать: Hashtable или Dictionary? - PullRequest
1 голос
/ 16 сентября 2009

Мне нужно определить класс с внутренним объектом коллекции для хранения различных типов значений (таких как 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.Это устаревшая коллекция, и производительность по сравнению с коллекцией словаря намного ниже.Должен ли я использовать словарь или любую другую коллекцию, доступную в .Net 3.5?

Ответы [ 5 ]

9 голосов
/ 16 сентября 2009

Лично я бы использовал Dictionary<string, object> в этом случае. По крайней мере, это остановит вас от попытки использовать нестроковый ключ.

Я бы также лично прекратил использовать защищенное поле - рассмотрите возможность добавления индексатора в базовый класс с защищенным установщиком и общедоступным получателем:

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

Если вы хотите, чтобы он возвращал null при доступе по отсутствующему ключу, вы должны использовать TryGetValue в геттере. Точно так же вы можете использовать Add в установщике, если хотите потерпеть неудачу при добавлении дубликата ключа.

4 голосов
/ 16 сентября 2009

Вы всегда должны использовать общие коллекции, если только нет веской причины не делать этого. Это гарантирует, что все достаточно безопасно для типов и уменьшает ошибки программирования. Есть также преимущества в производительности, если вы сохраняете типы значений в универсальном словаре; если вы используете Hashtable, каждый тип значения должен быть в штучной упаковке.

Ваш пример, тем не менее, кажется небезопасным по типу и имеет запах кода. Есть ли конкретная причина, по которой у вас есть две переменные типа для доступа к одной и той же хеш-таблице?

2 голосов
/ 16 сентября 2009

Hashtable существовал в 1.1. Словарь не существовал, пока в 2.0 не появились дженерики. Я не думаю, что есть какая-либо причина использовать Hashtable в 2.0 и более поздних версиях - это по сути жестко закодированный словарь , и он (вероятно?) Просто для того, чтобы позволить портированному коду 1.1 работать.

Таким образом, здесь должен быть выбран словарь.

1 голос
/ 16 сентября 2009

Я бы использовал словарь, но я действительно хотел, чтобы моя коллекция была безопасной, я мог бы реализовать безопасный для типов гетерогенный контейнер, описанный в Пункт 29 эффективной Java (пример для Java, но Приложение должно работать на обоих языках, хотя детали и ограничения могут отличаться). Этот метод кодирует тип значения в ключ.

0 голосов
/ 16 сентября 2009

Я бы пошел со словарем. Я могу вспомнить только один сценарий, в котором Hashtable может быть предпочтительным. Это потокобезопасный для одного писателя и нескольких читателей без использования механизмов синхронизации. Но такой сценарий был бы очень конкретным и довольно редким. И даже тогда я, вероятно, пошел бы со Словарём и использовал бы все обычные примитивы синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...