Supposons que vous utilisiez l'opérateur ternaire, ou l'opérateur de coalescence nulle, ou des instructions if-else imbriquées pour choisir l'affectation à un objet. Supposons maintenant que dans l'instruction conditionnelle, vous ayez l'évaluation d'une opération coûteuse ou volatile, nécessitant que vous mettiez le résultat dans une variable temporaire, en capturant son état, afin qu'il puisse être comparé, puis potentiellement affecté.How-to: court-circuiter l'opérateur ternaire inversé implémenté dans, par ex. C#? Est-ce que ça importe?
Comment un langage, tel que C#, à prendre en compte, implémenterait-il un nouvel opérateur logique pour gérer ce cas? Devrait-il? Existe-t-il des moyens de gérer ce cas en C#? Autres langues?
Certains cas de réduction de la verbosité d'un opérateur de coalescence ternaire ou nul ont été surmontés, lorsque nous supposons que nous recherchons des comparaisons directes, par exemple. Voir Unique ways to use the Null Coalescing operator, en particulier la discussion autour de la façon dont on peut étendre l'utilisation de l'opérateur pour soutenir String.IsNullOrEmpty(string)
. Notez comment Jon Skeet utilise le PartialComparer
de MiscUtil
, reformater 0
s à null
s,
Pourquoi est-ce peut-elle nécessaire? Eh bien, jetez un oeil à la façon d'écrire une méthode de comparaison des objets complexes sans raccourcis (exemples des discussions citées):
public static int Compare(Person p1, Person p2)
{
return ((result = Compare(p1.Age, p2.Age)) != 0) ? result
: ((result = Compare(p1.Name, p2.Name)) != 0) ? result
: Compare(p1.Salary, p2.Salary);
}
Jon Skeet écrit une nouvelle comparaison de repli le cas d'égalité. Cela permet l'expression d'étendre en écrivant une nouvelle méthode spécifique qui renvoie la valeur null, ce qui nous permet d'utiliser l'opérateur coalescent null:
return PartialComparer.Compare(p1.Age, p2.Age)
?? PartialComparer.Compare(p1.Name, p2.Name)
?? PartialComparer.Compare(p1.Salary, p2.Salary)
?? 0;
L'opérateur coalescent null est plus lisible car il a deux côtés, pas trois. La clause de condition booléenne est séparée en une méthode, dans ce cas renvoyant null
si l'expression doit être continuée. A quoi ressemblerait l'expression ci-dessus si nous pouvions mettre la condition en ligne plus facilement? Prenez l'expression de PartialComparer.Compare
qui retourne null
, et le placer dans une nouvelle expression ternaire qui nous permet d'utiliser l'évaluation de l'expression côté gauche, avec une variable temporaire implicite value
:
return Compare(p1.Age, p2.Age) unless value == 0
: Compare(p1.Name, p2.Name) unless value == 0
: Compare(p1.Salary, p2.Salary);
Le « flux » de base d'une expression serait:
expressionA moins quebooleanB dans lequel ca SE expressionC
Plutôt que d'être un opérateur de comparaison surchargé, je suppose que cela est plus comme un court-circuit opérateur ternaire inversé.
- Ce type de logique serait-il utile? Actuellement, la fusion nulle nous fournit un moyen de le faire avec l'expression conditionnelle
(value == null)
. - Quelles autres expressions souhaitez-vous tester? Nous avons entendu parler de
(String.IsNullOrEmpty(value))
. - Quel serait le meilleur moyen d'exprimer cela dans la langue, en termes d'opérateurs, de mots-clés?
"Pas une vraie question", hein? Je suppose que "Qu'est-ce que vous utilisez pour garder des notes en tant que développeur" @ http://stackoverflow.com/questions/78756/ et "Y at-il des programmeurs one-man-army célèbres @ http://stackoverflow.com/questions/ 529757 /, avec d'autres allant de "Quelle est votre bande dessinée programmeur préférée" à "De bonnes citations de programmation" sont tellement plus réel que de discuter de la conception du langage de programmation.Je suppose que je devrais retag l'une des balises ci-dessus à «subjective», mais comment – maxwellb
, le cas d'utilisation représenté ici ne permet pas d'utiliser facilement 'if (B) C else A', car B dépend de l'évaluation de C ou A. – maxwellb
@mpbloch: cliquez sur éditer pour changer les mots-clés sur votre question et btw, c'est une question intéressante, pas de raison de la fermer IMHO ... –