122 votes

Quelle est la bonne façon de vérifier les valeurs null ?

J'aime le null-coalescence de l'opérateur car il est facile d'attribuer une valeur par défaut pour les types nullables.

 int y = x ?? -1;

C'est très bien, sauf si j'ai besoin de faire quelque chose de simple avec x. Par exemple, si je veux vérifier Session, alors j'ai l'habitude de finir par avoir à écrire quelque chose de plus détaillé.

Je souhaite que je pourrais faire ceci:

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

Mais vous ne pouvez pas parce que l' .ToString() est appelée avant le nul de vérifier si elle échoue si Session["key"] a la valeur null. J'ai fini par faire ceci:

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

Il fonctionne et qui est mieux, à mon avis, que les trois de la ligne de solution de rechange:

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

Même si cela fonctionne, je suis toujours curieux de savoir si il ya une meilleure façon. Il semble peu importe ce que j'ai toujours de référence Session["key"] deux fois: une fois pour le vérifier, et de nouveau pour la mission. Des idées?

182voto

BlackBear Points 10069

Qu'en est-il de

130voto

Jon Skeet Points 692016

Si vous faites souvent ce précisément avec `` puis vous pourriez écrire une méthode d’extension :

Ou une méthode prenant un défaut, bien sûr :

21voto

Andomar Points 115404

Vous pouvez également utiliser `` , dont les rendements `` si la conversion échoue :

Cela reviendrait même si quelqu'un farci une en `` .

13voto

minitech Points 87225

Si il sera toujours un `` , vous pouvez effectuer un cast :

Cela a l’avantage de se plaindre au lieu de cacher l’erreur si quelqu'un fourre une ou quelque chose dans .  ;)

10voto

Richard Points 4263

Toutes les solutions proposées sont bonnes, et de répondre à la question; donc, c'est juste pour s'étendre sur les légèrement. Actuellement, la plupart des réponses ne traitent que de la valeur null de validation et de types de chaînes. Vous pouvez étendre la StateBag objet générique GetValueOrDefault méthode, similaire à la réponse posté par Jon Skeet.

Un simple générique de la méthode d'extension qui accepte une chaîne de caractères comme une clé, puis tapez les vérifications de l'objet session. Si l'objet est null ou pas le même type, la valeur par défaut est retourné, sinon la session, la valeur renvoyée est fortement typé.

Quelque chose comme ceci

/// <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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X