2014-10-09 21 views
9

In .NET, possiamo creare sezioni di configurazione personalizzate utilizzando l'elemento <configSections>, in questo modo:C'è una differenza tra DictionarySectionHandler e NameValueSectionHandler?

<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> 

Sopra, sto definendo due sezioni. Uno di tipo DictionarySectionHandler e un altro di tipo NameValueSectionHandler.

Per quanto posso dire, questi due gestori sono utilizzati esattamente nello stesso modo e risultano in sezioni di configurazione identiche.

Quindi, c'è una differenza o posso usarli in modo intercambiabile?

risposta

10

TL; DRNameValueSectionHandler è bene per string ->string coppie in situazioni semplici, ma se avete bisogno la configurazione per essere efficiente (soprattutto se avete intenzione di utilizzare remove più volte), utilizzare DictionarySectionHandler.


I scavate nella fonte di queste due classi (NameValue, Dictionary), e trovato molto poca differenza di attuazione.

ci sono due cose da notare, però:

  1. Come i nomi dei gestori accenno alla, la differenza principale è nelle collezioni che usano: DictionarySectionHandler memorizza le sue coppie chiave/valore in un Hashtable, mentre NameValueSectionHandler utilizza uno NameValueCollection.
  2. Nel DictionarySectionHandler, lo value non è richiesto e verrà impostato automaticamente su una stringa vuota se non viene fornito, ma NameValueSectionHandler richiede value.

Per quanto riguarda le differenze tra Hashtable e NameValueCollection, NameValueCollection può avere chiavi duplicate, ma non riesco a Hashtable. Inoltre, Hashtable è decisamente più efficiente nella sua implementazione.

This article on the MSDN Blog ha alcune buone informazioni su Hashtable e NameValueCollection.

In sintesi i loro risultati, Hashtable è ...

  • 2.6x più efficiente sulla ricerca.
  • 8.5 volte più efficiente in aggiunta.
  • un ordine di grandezza più efficiente alla rimozione.

Essi avvolgono l'articolo con alcune informazioni utili su quando utilizzare NameValueCollection:

Così ci si potrebbe chiedere se ci si desidera utilizzare NameValueCollection. NameValueCollection accetta solo chiavi e valori che sono stringhe, quindi questa è una collezione molto specializzata. È utile in una situazione in cui è necessario associare più valori a una chiave, o fare ricerche basate su hash e cercare per indice (e si spera non esegua troppe rimuova).

Tuttavia, se è necessario memorizzare coppie chiave/valore stringa e non è necessario eseguire ricerche basate su indici o associare più valori con una chiave, è preferibile utilizzare la classe Dizionario generica. Questo ha lo stesso comportamento asintotico di Hashtable in tutti i casi e inoltre evita qualsiasi costo dovuto al pugilato.