Есть ли разница между 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, словарь ), и нашел очень мало различий в реализации.
Однако есть две вещи, которые стоит отметить:
- как намекают имена обработчиков, первичный разница заключается в коллекциях, которые они используют:
DictionarySectionHandler
хранит свои пары ключ / значение в aHashtable
, тогда какNameValueSectionHandler
используетNameValueCollection
.- в
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 во всех случаях, и, кроме того, позволяет избежать любых затрат из-за бокса.