Pregunta

Estoy creando una sección de configuración personalizada (heredando System.Configuration.ConfigurationSection), y me pregunto si tengo que hacer una validación de valor para una ConfigurationProperty que es un int Nullable. Es decir, ¿tengo que hacer esto?

[ConfigurationProperty("NullableInt", IsRequired = true)]
public int? NullableInt
{
    get 
    {
        return String.IsNullOrEmpty(Convert.ToString(this["NullableInt"]))
                    ? (int?) null
                    : Convert.ToInt32(this["NullableInt"]);
    }
    set
    {
        this["NullableInt"] = value.HasValue ? Convert.ToString(value) : "";
    }
}

¿O puedo hacer algo como esto:

[ConfigurationProperty("NullableInt", IsRequired = true)]
public int? NullableInt
{
    get{ return Convert.ToInt32(this["NullableInt"]); }
    set{ this["NullableInt"] = Convert.ToString(value); }
}

¿O hay una mejor manera de todos juntos?

Gracias de antemano.

¿Fue útil?

Solución

Bueno, Convert.ToInt32 devolverá 0 si el valor es nulo y arrojará una excepción si la expresión no es numérica ... así que sí, ¡quieres validación! - especialmente porque desea que la propiedad devuelva nulo para nulo y no 0 (que es lo que Convert.ToInt32 devolvería para nulo como se señaló anteriormente)

Además, puede ser útil señalar la función Int32.Parse () que es muy similar a Convert.ToInt32 () pero que arroja una ArgumentNullException si intenta analizar nulo, que es La principal diferencia entre Convert.ToInt32 y Int32.Parse ()

Otros consejos

La primera es la respuesta más completa.

El segundo funcionará bien en muchos casos, pero falla en los casos extremos. Al escribir una sección como esta, debe asegurarse de los invariantes simples de la propiedad. Es decir, que lo siguiente será cierto para todos los valores de int?

int? v1 = GetSomeNullableIntValue();
obj.NullableInt = v1;
int? v2 = obj.NullableInt;
bool equal = v1 == v2;  // Must be true

Su segundo ejemplo no garantiza el valor nulo de int ?. Considere cómo un nulo int? será representado en este escenario? Pasando en un int nulo? arrojará valor al conjunto y, por lo tanto, nunca se puede agregar a la colección. Del mismo modo, suponiendo que se haya almacenado como nulo o String. Vacío en la configuración, ¿nunca volverá a salir como un int nulo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top