2017-06-28 1 views
11

Avec l'introduction de Null-Conditional Operators en C#, pour l'évaluation suivante,opérateur Null-conditionnel et! =

if (instance != null && instance.Val != 0) 

Si je réécris cette façon,

if (instance?.Val != 0) 

il sera évalué à true si instance est une référence null; Il se comporte comme

if (instance == null || instance.Val != 0) 

Alors, quelle est la bonne façon de réécrire l'évaluation en utilisant cette nouvelle syntaxe?

Edit:

instance est un champ d'un grand objet qui est désérialisé de JSON. Il y a quelques morceaux de code comme celui-ci, vérifiez d'abord si le champ est dans le JSON, si c'est le cas, vérifiez si la propriété Val n'est pas égale à une constante, seules les deux conditions sont vraies, faites une opération.

Le code lui-même peut être refactorisé pour rendre le flux logique plus "logique" comme indiqué par Peter dans son commentaire, bien que dans cette question je suis intéressé par comment utiliser null-conditional operators avec !=.

+2

Je serais tenté de faire quelque chose comme 'if ((instance? .Val ?? 0)! = 0)' – john

+1

En fait, il se comporte comme 'instance? .Val! = 0', où depuis le court circuited 'null' ne peut pas égaler' 0', l'expression entière est 'true'. Franchement, il n'y a pas assez de contexte pour savoir ce que «la bonne façon» d'aborder est l'expression. Il me semble étrange que les deux une valeur «nulle» et une valeur nulle à la fois conduire au même bloc d'exécution de code. Étant donné que vous êtes dans cette situation, il peut y avoir une meilleure façon d'aborder le scénario. Ou peut-être, n'essayez simplement pas de chausse-pied null-conditionnel ici, puisque tout ce qu'il va faire est de rendre le code _less_ lisible. –

+1

J'ai créé un [violon] (https://dotnetfiddle.net/kf96px) du problème. Peter, il semble être un garde contre l'exécution d'une action, sauf si Val a une valeur non nulle/non nulle, ce qui ne me semble pas faux si vous créiez quelque chose comme une méthode API PATCH. – john

Répondre

6

avec l'opérateur Null conditionnelle valeur retournée peut toujours être nulle

if ((instance?.Val ?? 0) != 0) 

Si par exemple était nulle, alors par exemple? .VAL sera également nulle (probablement int? Dans votre cas). Donc, vous devriez toujours vérifier avant de comparer pour nulls avec quoi que ce soit:

if ((instance?.Val ?? 0) != 0) 

Cela signifie: Si par exemple .VAL est nulle (car par exemple est nul) puis revenir 0. Sinon revenir instance.Val?. Ensuite, comparez cette valeur avec 0 (n'est pas égal à).

7

Vous pouvez utiliser l'opérateur de coallescing null:

instance?.Val ?? 0 

Lorsque instance est nul ou instance est non nulle mais Val est, l'expression ci-dessus évaluerait à 0. Sinon, la valeur de Val serait renvoyé.

2
if ((instance?.Val).GetValueOrDefault() != 0) 

le? L'opérateur conditionnel traitera automatiquement la propriété .Val comme Nullable.

+0

Oui, et '(instance? .Val) .GetValueOrDefault()' sera identique à '(instance? .Val ?? 0)' après la compilation, où '0' est la constante de compilation également appelée' default (int) '. –