web-dev-qa-db-fra.com

Opérateur null-conditionnel et! =

Avec l'introduction de Null-Conditional Operators en C #, pour l'évaluation suivante,

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

Si je le réécris de cette façon,

if (instance?.Val != 0)  

elle sera évaluée à true si l'instance est une référence nulle; 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?

Modifier:

instance est un champ d'un gros 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, effectuez une opération.

Le code lui-même peut être refactorisé pour rendre le flux logique plus "sens" comme indiqué par Peter dans son commentaire, bien que dans cette question je m'intéresse à la façon d'utiliser null-conditional operators avec !=.

16
kennyzx

Avec l'opérateur Null-Conditional, la valeur renvoyée peut toujours être nulle

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

Si l'instance était nulle, l'instance? .Val sera également nulle (probablement int? Dans votre cas). Vous devez donc toujours vérifier les valeurs nulles avant de comparer avec quoi que ce soit:

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

Cela signifie: si l'instance? .Val est nulle (parce que l'instance est nulle) alors retourne 0. Sinon retourne instance.Val. Comparez ensuite cette valeur avec 0 (n'est pas égal à).

10
Pablo notPicasso

Vous pouvez utiliser l’opérateur null coallescing:

instance?.Val ?? 0

Lorsque instance est null ou instance n'est pas null mais Val l'est, l'expression ci-dessus est évaluée à 0. Sinon, la valeur de Val est renvoyée.

7
Christos
if ((instance?.Val).GetValueOrDefault() != 0)  

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

2
Steve Py