2010-09-08 20 views
21

Tengo una propiedad que me gustaría escribir como int? en mi archivo Settings.settings. Cuando uso int? consigo un fallo de tiempo de ejecución:Tipo int nullable permitido en Configuración.

System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto ..

puedo usar un tipo de cadena como una solución en un cheque por obras nulos, pero tengo que analizar la cadena y manejar los errores cuando el análisis no funciona.

Ser capaz de establecer el valor en nulo me permite mantener la propiedad documentada en el archivo de configuración mientras que es obvio que no se ha establecido ningún valor. Si no se activa utilizo un valor programado por defecto:

int? configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits; 
if (configuredNumberOfLimits == null ) 
{ 
    requiredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 
+0

Uso var en su lugar? – Gage

+1

@Gage: Creo que no tiene sentido. Él quiere que la configuración * definida * como 'int?'. –

Respuesta

2

creo que su mejor apuesta va a ser un anticuado bool/int combinado. No es la solución más bonita, pero en realidad no es que es diferente de int?.

int configuredNumberOfLimits; 
if (Settings.Default.HasRequiredNumberOfLimits) 
{ 
    configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits; 
} 
else 
{ 
    configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 
+0

Gracias. Desde int? no es un tipo admitido en Settings.settings mi elección parece ser entre lo que sugirió y lo que sugiere @Kevin. – Don

+0

@Martin: Sí, casi;) –

3

¿Qué hay de:

int configuredNumberOfLimits 

if(!int.TryParse(Settings.Default.RequiredNumberOfLimits, 
    out configuredNumberOfLimits)) 
{ 
    configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 

De esta manera se puede comprobar el valor, y si no se establece el valor predeterminado. No se preocupe por cadenas o análisis, o excepciones no manejadas.

+0

Esa es la solución que mencioné. Me gustaría evitar el análisis si es posible. – Don

+0

No lo he intentado, pero ¿has intentado int? value = Configuración ... como (int) – kemiller2002

52

Hay una manera de usar un tipo que admite nulos (es decir, int?) para una configuración: requiere un poco de edición manual del archivo de configuración, pero luego funciona bien en el entorno VS y en el código. Y no requiere funciones adicionales o envoltorios.

Para ello, cree un entorno con el nombre deseado (por ejemplo RequiredNumberOfLimit) y hacen que sea de cualquier tipo (por ejemplo estándar int por conveniencia). Guarde los cambios.

Ahora vaya a la carpeta del proyecto y abra el archivo "Propiedades \ Configuracións.Configuración" con editor de texto (Bloc de notas, por ejemplo) O puede abrirlo en VS haciendo clic con el botón secundario en Solution Explorer en "< Su proyecto > -> Propiedades -> Configuración. ", Seleccione" Abrir con ... "y luego elija" Editor XML "o" Editor de código fuente (texto) ". En la configuración XML abiertos encontrar su configuración (que se verá como esto):

<Setting Name="RequiredNumberOfLimit" Type="System.Int32" Scope="User"> 
    <Value Profile="(Default)">0</Value> 
</Setting> 

cambiar el "Tipo" parámetro System.Int32-System.Nullable<System.Int32>. Y también borre el valor predeterminado (por lo que null podría usarse allí por defecto). Ahora bien, esta sección debería tener este aspecto (tenga en cuenta que &lt; y &gt; se utilizan para representar < y > símbolos dentro de la cadena de tipo - esto se hace para un correcto análisis de XML por VS):

<Setting Name="RequiredNumberOfLimit" Type="System.Nullable&lt;System.Int32&gt;" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

Ahora guardar los cambios y volver a abrir la configuración del proyecto - voilà! - tenemos la configuración RequiredNumberOfLimit con el tipo System.Nullable<System.Int32> que VS Settings Designer procesa correctamente, y también se puede utilizar como una variable normal int? en el código.

Si desea que esta configuración sea capaz de devolver null, debe mantener despejado el campo de valor predeterminado. De lo contrario, el valor predeterminado será devuelto por esta configuración si se asignó a nulo previamente (pero así es como funcionan los valores predeterminados, ¿no ?: P).

+0

Cool !! ¡Funciona de maravilla! –

+4

El enfoque funcionó para ver la configuración en el Diseñador de configuraciones y para establecer el valor predeterminado en el código. Sin embargo, mi configuración desapareció del archivo App.config cuando hice este cambio. Eso puede o no ser importante en un contexto dado, pero pensé que valía la pena señalarlo. – Brian

+1

Para agregar a lo que dijo @Brian: sí, la edición con el Diseñador de configuraciones borrará la configuración de app.config, pero si los vuelve a poner, se leerán desde allí nuevamente. Entonces, o no use el diseñador, o recuerde volver a colocar la configuración después de usarla ... algo así como un dolor, pero en mi caso creo que vale la pena. – Paul

1

es posible escribir de configuración manual en Settings.Designer.cs

Por ejemplo:

public decimal? Test{ 
     get { 
      return ((decimal?)(this["Test"])); 
     } 
     set { 
      this["Test"] = value; 
     } 
    } 
+0

El problema con esto es que cada vez que realice un cambio en la pestaña Configuración, tendrá que regresar al diseñador.cs y cambiar el tipo nuevamente. –

+0

sí, por supuesto. en mi caso, lo cambio muy raramente, y no es un problema para mí –

Cuestiones relacionadas