Есть ли разница между 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 во всех случаях, и, кроме того, позволяет избежать любых затрат из-за бокса.