section read net manager how example app c# .net configuration app-config configsection

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:

  1. Como indican los nombres de los controladores, la principal diferencia radica en las colecciones que utilizan: DictionarySectionHandler almacena sus pares clave / valor en una NameValueSectionHandler , mientras que NameValueSectionHandler utiliza una NameValueCollection .
  2. En DictionarySectionHandler , el value no es obligatorio y se convertirá en una cadena vacía si no se proporciona, pero NameValueSectionHandler requiere el value .

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?