Есть ли разница между DictionarySectionHandler и NameValueSectionHandler?


В .NET мы можем создавать пользовательские разделы конфигурации с помощью <configSections> элемент, например:

<configuration>
  <configSections>
    <section name="dictionarySample"
             type="System.Configuration.DictionarySectionHandler"/>
    <section name="nameValueSample"
             type="System.Configuration.NameValueSectionHandler" />
  </configSections>
  <dictionarySample>
    <add key="key1" 
         value="value1"/>
  </dictionarySample>
  <nameValueSample>
    <add key="key2" 
         value="value2" />
  </nameValueSample>
</configuration>
Выше я определяю два раздела. Один из типов DictionarySectionHandler, и еще один типаж NameValueSectionHandler. Насколько я могу судить, эти два обработчика используются совершенно одинаково и приводят к одинаковым разделам конфигурации.

Итак, есть ли разница, или я могу использовать их взаимозаменяемо?

1 9

1 ответ:

TL; DR NameValueSectionHandler это нормально для string->string пары в простых ситуациях, но если вам нужно, чтобы ваша конфигурация была эффективной (особенно если вы собираетесь использовать remove повторно), используйте DictionarySectionHandler.


Я раскопал источник этих двух классов (NameValue, словарь ), и нашел очень мало различий в реализации.

Однако есть две вещи, которые стоит отметить:
  1. как намекают имена обработчиков, первичный разница заключается в коллекциях, которые они используют: DictionarySectionHandler хранит свои пары ключ / значение в a Hashtable, тогда как NameValueSectionHandler использует NameValueCollection.
  2. в DictionarySectionHandler, value не требуется и будет по умолчанию пустой строкой, если он не предусмотрен, но NameValueSectionHandler требует value.

Что касается различий между Hashtable и NameValueCollection, NameValueCollection может иметь дубликаты ключей, но Hashtable не может. Кроме того, Hashtable довольно значительно эффективнее в своем реализация.

Эта статья в блоге MSDN содержит хорошую информацию о Hashtable и NameValueCollection.

Чтобы обобщить их выводы, Hashtable является...

  • 2.6 x более эффективно при поиске.
  • 8.5 x более эффективно на add.
  • на порядок эффективнее по удалению.

Они завершают статью некоторой полезной информацией о том, когда использовать NameValueCollection:

Так что вам может быть интересно, когда вы захотите использовать Namevaluecollection, который. NameValueCollection принимает только ключи и значения, которые являются строками, поэтому это очень специализированная коллекция. Это полезно в ситуации, когда вам нужно либо связать несколько значений с ключом, либо выполнить поиск на основе хэша, а также поиск по индексу (и, надеюсь, не выполнять слишком много удалений).

Однако, если вам нужно хранить пары ключ/значение строки и вам не нужно выполнять поиск по индексу или связывать несколько значений с ключом, вы можете предпочитают использовать универсальный класс Dictionary. Это имеет такое же асимптотическое поведение, как и Hashtable во всех случаях, и, кроме того, позволяет избежать любых затрат из-за бокса.