Есть ли разница между 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 ответ

Решение

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


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

Однако стоит отметить две вещи:

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

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

Эта статья в блоге MSDN содержит полезную информацию о Hashtable а также NameValueCollection,

Подводя итог их выводам, Hashtable является...

  • 2.6x более эффективен при поиске.
  • В 8,5 раз эффективнее при доп.
  • на порядок более эффективен при удалении.

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

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

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

Другие вопросы по тегам