121 votos

¿Cuál es la forma correcta para comprobar valores null?

Me encanta el null-coalescente de operador ya que hace que sea fácil asignar un valor por defecto para los tipos que aceptan valores null.

 int y = x ?? -1;

Eso es genial, excepto si tengo que hacer algo sencillo con x. Por ejemplo, si quiero verificar Session, entonces por lo general termina encima de tener que escribir algo más detallado.

Me gustaría poder hacer esto:

string y = Session["key"].ToString() ?? "none";

Pero no puede porque la .ToString() se llama antes de la verificación null por lo que no si Session["key"] es null. Me acaban de hacer esto:

string y = Session["key"] == null ? "none" : Session["key"].ToString();

Funciona y es mejor, en mi opinión, que la línea de tres alternativas:

string y = "none";
if (Session["key"] != null)
    y = Session["key"].ToString();

A pesar de que funciona todavía estoy curioso por saber si hay una manera mejor. Parece que no importa lo que siempre tengo a la referencia Session["key"] dos veces; una para la verificación, y de nuevo para la asignación. Alguna idea?

183voto

BlackBear Puntos 10069
¿Y

130voto

Jon Skeet Puntos 692016

Si lo haces con frecuencia específicamente con ToString() y luego se podría escribir un método de extensión:

public static string NullPreservingToString(this object input)
{
    return input == null ? null : input.ToString();
}

...

string y = Session["key"].NullPreservingToString() ?? "none";

O un método predeterminado, por supuesto:

public static string ToStringOrDefault(this object input, string defaultValue)
{
    return input == null ? defaultValue : input.ToString();
}

...

string y = Session["key"].ToStringOrDefault("none");

21voto

Andomar Puntos 115404

También puede usar as , que los rendimientos null si falla la conversión:

Session["key"] as string ?? "none"

Esto devolverá "none" incluso si alguien rellena un int en Session["key"] .

14voto

minitech Puntos 87225

Si siempre será un string , puedes lanzar:

string y = (string)Session["key"] ?? "none";

Esto tiene la ventaja de quejarse en lugar de ocultar el error si alguien mete un int o algo en Session["key"] . ;)

10voto

Richard Puntos 4263

Todas las soluciones que se proponen son buenas, y responder a la pregunta; así que esto es sólo para extender en él ligeramente. En la actualidad la mayoría de las respuestas sólo se ocupan de null validación y tipos de cuerdas. Se podría extender el StateBag objeto de incluir una genérica GetValueOrDefault método, similar a la respuesta publicado por Jon Skeet.

Una simple extensión genérica del método que acepta una cadena de caracteres como una clave, y, a continuación, escriba comprueba el objeto de la sesión. Si el objeto es nulo o no es el mismo tipo, el valor predeterminado es devuelto, de lo contrario la sesión se devuelve el valor de establecimiento inflexible de tipos.

Algo como esto

/// <summary>
/// Gets a value from the current session, if the type is correct and present
/// </summary>
/// <param name="key">The session key</param>
/// <param name="defaultValue">The default value</param>
/// <returns>Returns a strongly typed session object, or default value</returns>
public static T GetValueOrDefault<T>(this HttpSessionState source, string key, T defaultValue)
{
    // check if the session object exists, and is of the correct type
    object value = source[key]
    if (value == null || !(value is T))
    {
        return defaultValue;
    }

    // return the session object
    return (T)value;
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X