la fusion nulle se traduit à peu près par return x, unless it is null, in which case return y
J'ai souvent besoin return null if x is null, otherwise return x.y
je peux utiliser return x == null ? null : x.y;
Pas mal, mais cela null
me dérange toujours au milieu - cela semble superflu. Je préférerais quelque chose comme return x :: x.y;
, où ce qui suit ::
est évalué uniquement si ce qui précède ne l'est pas null
.
Je vois cela comme presque l'opposé de la coalescence nulle, en quelque sorte mélangée à un contrôle nul en ligne, mais je suis [ presque ] certain qu'il n'y a pas d'opérateur de ce type en C #.
Y a-t-il d'autres langages qui ont un tel opérateur? Si oui, comment s'appelle-t-il?
(Je sais que je peux écrire une méthode pour cela en C #; j'utilise return NullOrValue.of(x, () => x.y);
, mais si vous avez quelque chose de mieux, j'aimerais voir cela aussi.)
return x ? x.y : NULL
. Yay pour convertir les types de pointeurs en booléens!Réponses:
Il y a l' opérateur de déréférencement à sécurité nulle (?.) Dans Groovy ... Je pense que c'est ce que vous recherchez.
(Il est également appelé l' opérateur de navigation sécurisée .)
Par exemple:
Cela donnera null si
person
,person.homeAddress
ouperson.homeAddress.postcode
est nul.(Ceci est maintenant disponible en C # 6.0 mais pas dans les versions antérieures)
la source
null
, par exemple:def bar = foo ?: "<null>"
Decimal? post = pre == null ? null : SomeMethod( pre );
. Ce serait bien si je pouvais le réduire à "Decimal? Post = pre :: SomeMethod (pre);"Nous avons envisagé d'ajouter?. à C # 4. Il n'a pas fait la coupe; c'est une fonctionnalité "agréable à avoir", pas une fonctionnalité "à avoir". Nous y reviendrons pour de futures versions hypothétiques de la langue, mais je ne retiendrais pas mon souffle si j'étais vous. Il est peu probable que cela devienne plus crucial avec le temps. :-)
la source
Si vous avez un type spécial de logique booléenne de court-circuit, vous pouvez le faire (exemple javascript):
Si
x
est nul, alors il ne sera pas évaluéx.y
.la source
Il me semblait juste d'ajouter ceci comme réponse.
Je suppose que la raison pour laquelle il n'y a rien de tel en C # est que, contrairement à l'opérateur de fusion (qui n'est valide que pour les types de référence), l'opération inverse pourrait donner un type de référence ou de valeur (c'est-
class x
à- dire avec membreint y
- donc ce serait malheureusement inutilisable dans de nombreuses situations.Je ne dis pas, cependant, que je n'aimerais pas le voir!
Une solution potentielle à ce problème serait que l'opérateur lève automatiquement une expression de type valeur sur le côté droit vers une valeur Nullable. Mais alors vous avez le problème que
x.y
où y est un entier retournera en fait unint?
qui serait pénible.Une autre solution, probablement meilleure, serait que l'opérateur renvoie la valeur par défaut (c'est-à-dire null ou zéro) pour le type sur le côté droit si l'expression sur la gauche est nulle. Mais ensuite, vous rencontrez des problèmes pour distinguer les scénarios dans lesquels un zéro / null a été lu
x.y
ou s'il a été fourni par l'opérateur d'accès sécurisé.la source
int?
comme valeur de retour par défaut, et l'utilisateur peut le changer en int s'il le souhaite. Par exemple, si je souhaite appeler une méthodeLookup
avec une valeur par défaut de -1 au cas où l'une de mes références seraitnull
:foo?.Bar?.Lookup(baz) ?? -1
?. :
être un opérateur ternaire, où le membre droit doit être du même type que le membre approprié donné au milieu?Delphi a l'opérateur: (plutôt que.), Qui est de sécurité null.
Ils pensaient ajouter un?. opérateur à C # 4.0 pour faire de même, mais cela a obtenu le bloc de hachage.
En attendant, il y a IfNotNull () qui sorte de rayures qui démangent. C'est certainement plus grand que?. ou:, mais cela vous permet de composer une chaîne d'opérations qui ne gênera pas une NullReferenceException si l'un des membres est nul.
la source
?.
est une fonctionnalité du langage C # 6.0, et oui, il fait exactement ce que l'OP a demandé ici. Mieux vaut tard que jamais ^^Dans Haskell, vous pouvez utiliser l'
>>
opérateur:Nothing >> Nothing
estNothing
Nothing >> Just 1
estNothing
Just 2 >> Nothing
estNothing
Just 2 >> Just 1
estJust 1
la source
Haskell a
fmap
, ce qui dans ce cas, je pense, équivaut àData.Maybe.map
. Haskell est purement fonctionnel, donc ce que vous recherchez seraitSi
x
c'est le casNothing
, cela revientNothing
. Six
c'est le casJust object
, cela revientJust (select_y object)
. Pas aussi joli que la notation par points, mais étant donné qu'il s'agit d'un langage fonctionnel, les styles sont différents.la source
PowerShell vous permet de référencer des propriétés (mais pas d'appeler des méthodes) sur une référence null et il renverra null si l'instance est null. Vous pouvez le faire à n'importe quelle profondeur. J'avais espéré que la fonctionnalité dynamique de C # 4 prendrait en charge cela, mais ce n'est pas le cas.
Ce n'est pas joli mais vous pouvez ajouter une méthode d'extension qui fonctionnera comme vous le décrivez.
la source
J'ai souvent besoin de cette logique pour les chaînes:
la source
Créez une instance statique de votre classe quelque part avec toutes les bonnes valeurs par défaut pour les membres.
Par exemple:
alors au lieu de ton
tu peux écrire
la source
Cela est ajouté dans C # vNext (Roslyn powered C #, versions avec Visual Studio 2014).
Il est appelé propagation Null et est répertorié ici comme complet. https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status
Il est également répertorié ici comme complet: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c
la source
Le soi-disant «opérateur conditionnel nul» a été introduit dans C # 6.0 et Visual Basic 14.
Dans de nombreuses situations, il peut être utilisé comme l'opposé exact de l'opérateur de fusion null:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators
la source