read - how to add app settings in c#
¿Hay alguna diferencia entre DictionarySectionHandler y NameValueSectionHandler? (1)
TL; DR NameValueSectionHandler
está bien para string
-> pares de string
en situaciones simples, pero si necesita que su configuración sea eficiente (particularmente si va a usar remove
repetidamente), use DictionarySectionHandler
.
Indagué en la fuente de estas dos clases ( NameValue , Dictionary ) y encontré muy poca diferencia en la implementación.
Sin embargo, hay dos cosas que vale la pena mencionar:
- Como indican los nombres de los controladores, la principal diferencia radica en las colecciones que utilizan:
DictionarySectionHandler
almacena sus pares clave / valor en unaNameValueSectionHandler
, mientras queNameValueSectionHandler
utiliza unaNameValueCollection
. - En
DictionarySectionHandler
, elvalue
no es obligatorio y se convertirá en una cadena vacía si no se proporciona, peroNameValueSectionHandler
requiere elvalue
.
En cuanto a las diferencias entre Hashtable
y NameValueCollection
, NameValueCollection
puede tener claves duplicadas, pero Hashtable
no puede. Además, Hashtable
es bastante significativamente más eficiente en su implementación.
Este artículo en el blog de MSDN contiene buena información sobre Hashtable
y NameValueCollection
.
Para resumir sus hallazgos, Hashtable
es ...
- 2.6 veces más eficiente en la búsqueda.
- 8.5x más eficiente en agregar.
- un orden de magnitud más eficiente en eliminar.
Terminan el artículo con información útil sobre cuándo utilizar NameValueCollection
:
Entonces se estará preguntando cuándo querría usar NameValueCollection. NameValueCollection solo acepta claves y valores que son cadenas, por lo que esta es una colección muy especializada. Es útil en una situación en la que necesita asociar valores múltiples con una clave, o realizar búsquedas basadas en hash, así como búsqueda por índice (y con suerte no realizar demasiados eliminaciones).
Sin embargo, si necesita almacenar pares clave / valor de cadena y no necesita realizar búsquedas basadas en índices o asociar valores múltiples con una clave, puede preferir utilizar la clase genérica Diccionario. Esto tiene el mismo comportamiento asintótico que Hashtable en todos los casos y además evita cualquier costo debido al boxeo.
En .NET, podemos crear secciones de configuración personalizadas usando el elemento <configSections>
, así:
<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>
Arriba, estoy definiendo dos secciones. Uno de tipo DictionarySectionHandler
, y otro de tipo NameValueSectionHandler
.
Por lo que puedo decir, estos dos controladores se utilizan exactamente de la misma manera y dan como resultado secciones de configuración idénticas.
Entonces, ¿hay alguna diferencia, o puedo usarlos indistintamente?