Есть ли разница между 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) и обнаружил, что разница в реализации очень мала.
Однако стоит отметить две вещи:
- Как намекают имена обработчиков, основное различие заключается в используемых ими коллекциях:
DictionarySectionHandler
сохраняет свои пары ключ / значение вHashtable
, в то время какNameValueSectionHandler
используетNameValueCollection
, - в
DictionarySectionHandler
,value
не требуется и по умолчанию будет пустой строкой, если она не указана, ноNameValueSectionHandler
требуетvalue
,
Насколько различия между Hashtable
а также NameValueCollection
, NameValueCollection
может иметь дубликаты ключей, но Hashtable
не могу. Дополнительно, Hashtable
довольно значительно более эффективен в своей реализации.
Эта статья в блоге MSDN содержит полезную информацию о Hashtable
а также NameValueCollection
,
Подводя итог их выводам, Hashtable
является...
- 2.6x более эффективен при поиске.
- В 8,5 раз эффективнее при доп.
- на порядок более эффективен при удалении.
Они завершили статью с некоторой полезной информацией о том, когда использовать NameValueCollection
:
Поэтому вам может быть интересно, когда вы захотите использовать NameValueCollection. NameValueCollection принимает только ключи и значения, которые являются строками, так что это очень специализированная коллекция. Это полезно в ситуации, когда вам нужно либо связать несколько значений с ключом, либо выполнить поиск на основе хеша, а также поиск по индексу (и, надеюсь, не выполнять слишком много удалений).
Однако, если вам нужно хранить пары ключ / значение строки и вам не нужно выполнять поиск на основе индекса или связывать несколько значений с ключом, вы можете предпочесть использовать общий класс Dictionary. Это имеет то же асимптотическое поведение, что и Hashtable во всех случаях, и, кроме того, позволяет избежать каких-либо затрат из-за бокса.