107 votes

Existe-t-il un "opposé" à l'opérateur de coalescence nul? (… Dans n'importe quelle langue?)

null coalescence se traduit approximativement à l' return x, unless it is null, in which case return y

J'ai souvent besoin d' return null if x is null, otherwise return x.y

Je peux utiliser return x == null ? null : x.y;

Pas mal, mais c' null dans le milieu toujours me dérange -- il semble superflu. Je préfère quelque chose comme return x :: x.y;, d'où ce qui suit l' :: est évaluée uniquement si ce qui précède, il n'est pas null.

Je considère que c'est presque le contraire de l'un à null coalescence, genre de mélange avec un laconique, inline null-vérifier, mais je suis [presque] certains qu'il n'existe pas un tel opérateur en C#.

Il existe d'autres langues qui ont un de ces opérateurs? Si oui, quel est-il appelé?

(Je sais que je peux écrire une méthode pour en C#; - je utiliser return NullOrValue.of(x, () => x.y);, mais si vous avez rien de mieux, j'aimerais voir ça aussi.)

68voto

Jon Skeet Points 692016

Il y a l' opérateur de déréférence null-safe (?.) Dans Groovy ... Je pense que c'est ce que vous recherchez.

(C'est aussi appelé l' opérateur de navigation sécurisée .)

Par exemple:

 homePostcode = person?.homeAddress?.postcode
 

Cela donnera zéro si person , person.homeAddress ou person.homeAddress.postcode est nul.

(Et non, C # n'a pas pour le moment.)

38voto

Eric Lippert Points 300275

Nous avons envisagé d'ajouter? à C # 4. Il n'a pas fait la coupe; c'est une fonctionnalité "agréable à avoir", pas une fonctionnalité "doit avoir". Nous y reviendrons pour de futures versions hypothétiques du langage, mais je ne retiendrais pas mon souffle si j'étais vous-même. Il est peu probable que cela devienne plus crucial à mesure que le temps passe. :-)

18voto

Eric Points 36290

Si vous avez un type particulier de logique booléenne de court-circuit, vous pouvez le faire (exemple en javascript):

 return x && x.y;
 

Si x est nul, il n'évaluera pas x.y .

7voto

Andras Zoltan Points 24996

Il a juste senti le droit d'ajouter cela comme une réponse.

Je suppose que la raison pour laquelle il n'y a pas une telle chose en C# est parce que, contrairement à la catalyse de l'opérateur (qui n'est valable que pour les types de référence), l'opération inverse, pourrait donner une référence ou une valeur de type ( class x avec les membres de l' int y - par conséquent, il serait malheureusement inutilisable dans de nombreuses situations.

Je ne dis pas, cependant, que je ne voudrais pas le voir!

Une solution potentielle à ce problème pour l'opérateur automatiquement soulever un type de la valeur de l'expression sur le côté droit de nullable. Mais ensuite, vous avez la question qu' x.y où y est un entier (int) va renvoyer en fait un int? qui serait une douleur.

Un autre, probablement mieux, la solution serait de l'opérateur pour retourner à la valeur par défaut (c'est à dire nulles ou égales à zéro) pour le type sur le côté droit si l'expression de gauche est nul. Mais alors vous avez des problèmes à distinguer les cas où un zéro/null a été lu à partir de x.y ou s'il a été fourni par le coffre-fort-accès de l'opérateur.

6voto

48klocs Points 3749

Delphi a l' : (plutôt que .) l'opérateur, qui est nulle à la sécurité.

Ils ont été de penser à l'ajout d'un ?. opérateur de C# 4.0 à faire de même, mais qui a obtenu le billot.

Dans l'intervalle, il y a IfNotNull() qui sorte de rayures qui démangent. Il est certainement plus grand que ?. ou :, mais il ne vous permettent de composer une chaîne d'opérations qui ne sont pas hork une NullReferenceException à vous si l'un des membres est null.

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