Est-il une “face” à la nulle coalescence de l'opérateur? (...dans n'importe quelle langue?)
null coalescence se traduit approximativement à 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 que null
dans le milieu toujours me dérange -- il semble superflu. Je préfère quelque chose comme return x :: x.y;
, où ce qui suit le ::
est évaluée uniquement si ce qui précède, il n'est pas null
.
Je vois cela comme presque un face à 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?
(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.)
- Certains ont demandé quelque chose comme x?.y en C#, mais rien de comparable à ce qui existe.
- Oh, ce serait beau. Merci.
- En c++, ce serait assez facile de s'exprimer en tant que
return x ? x.y : NULL
. Yay pour la conversion de types de pointeur de booléens! - c'est une des choses qui m'énerve le plus dans le C#, c'est qu'ils n'ont pas suivi le C si si(n'importe quoi) = vrai, sauf quand il est si(0, false, null)
- ce n'est pas une déclaration exacte de C. Si vous avez un non-variable scalaire (comme une structure (struct), vous ne pouvez pas l'utiliser dans une condition.
- Si elle était mise en œuvre, je pense qu'une bonne syntaxe serait
x ?=> y
: retourner la valeur null si x est nul, sinon retourner y - Suggestions:
return x == null ? null : Whatever(x);
: visualstudio.uservoice.com/forums/121579-visual-studio/...return x == null ? null : x.Property;
: visualstudio.uservoice.com/forums/121579-visual-studio/...
Vous devez vous connecter pour publier un commentaire.
Il y a le null-sûr référence à l'opérateur (?.) en Groovy... je pense que c'est ce que vous êtes après.
(Il est aussi appelé le la sécurité de la navigation de l'opérateur.)
Par exemple:
Cela donnera la valeur null si
person
,person.homeAddress
ouperson.homeAddress.postcode
est null.(C'est maintenant disponible en C# 6.0 mais pas dans les versions antérieures)
null
, par exemple:def bar = foo ?: "<null>"
Decimal? post = pre == null ? null : SomeMethod( pre );
. Ce serait bien si je pouvais réduire à "Virgule? post = pre :: SomeMethod( pré );"Nous avons considéré l'ajout ?. C# 4. Il n'a pas fait la coupe; c'est un "nice to have" caractéristique, pas un "gotta" caractéristique. Nous allons examiner à nouveau pour d'hypothétiques futures versions de la langue, mais je ne voudrais pas retenir mon souffle en attendant, si j'étais vous. Il n'est pas susceptible de recevoir plus crucial que le temps passe. 🙂
Si vous avez un type spécial de court-circuit de la logique booléenne, vous pouvez le faire (exemple en javascript):
Si
x
est null, alors il n'évalue pasx.y
.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 type de valeur (c'est à dire
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 le problème
x.y
où y est un entier (int) va renvoyer en fait unint?
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.int?
que la valeur de retour par défaut, et l'utilisateur peut le changer pour un int si il veut. Par exemple, si je souhaite appeler une méthodeLookup
avec une valeur par défaut -1 dans le cas où l'une de mes références estnull
:foo?.Bar?.Lookup(baz) ?? -1
?. :
être un opérateur ternaire, où la droite est nécessaire pour être du même type que le membre approprié compte tenu du milieu?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.
?.
C# 6.0 pour le langage, et oui, c'est exactement ce que l'OP a demandé ici. Mieux vaut tard que jamais ^^En Haskell, vous pouvez utiliser le
>>
opérateur:Nothing >> Nothing
estNothing
Nothing >> Just 1
estNothing
Just 2 >> Nothing
estNothing
Just 2 >> Just 1
estJust 1
Haskell a
fmap
, qui, dans ce cas, je pense, est équivalent àData.Maybe.map
. Haskell est purement fonctionnelle, de sorte que vous êtes à la recherche pour seraitSi
x
estNothing
, cela renvoieNothing
. Six
estJust object
, cela renvoieJust (select_y object)
. Pas aussi jolie que la notation point, mais étant donné que c'est un langage fonctionnel, les styles sont différents.PowerShell vous permet de propriétés de référence (mais pas d'appeler des méthodes) sur une référence null et il va retourner la valeur null si l'instance est null. Vous pouvez le faire à n'importe quelle profondeur. J'avais espéré que C# 4 dynamique de la fonction de soutien de cela, mais il ne le fait pas.
C'est pas joli, mais vous pouvez ajouter une extension de la méthode qui sera fonction de la façon dont vous décrivez.
J'ai souvent besoin de cette logique pour les chaînes:
Créer une instance statique de votre classe quelque part avec toutes les valeurs par défaut pour les membres.
Par exemple:
alors au lieu de votre
vous pouvez écrire
Ce qui est ajouté en C# vNext (Roslyn alimenté C#, les rejets avec Visual Studio 2014).
Il est appelé Null propagation et la liste est complète.
https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status
Elle est également inscrite ici aussi complète:
https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c
La soi-disant "null-opérateur conditionnel" a été introduit en C# 6.0 et Visual Basic 14.
Dans de nombreuses situations, il peut être utilisé comme l'exact opposé de la valeur null est-coalescence de l'opérateur:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators