Je sais que la manière standard d'utiliser l'opérateur de fusion Null en C # consiste à définir des valeurs par défaut.
string nobody = null;
string somebody = "Bob Saget";
string anybody = "";
anybody = nobody ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"
Mais à quoi d'autre peut- ??
on servir? Il ne semble pas aussi utile que l'opérateur ternaire, en plus d'être plus concis et plus facile à lire que:
nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget
Donc, étant donné que moins de gens connaissent même l'opérateur de fusion nul ...
Avez-vous utilisé
??
pour autre chose?Est
??
nécessaire, ou devriez-vous simplement utiliser l'opérateur ternaire (que la plupart sont familiers avec)
c#
coding-style
null
conditional-operator
null-coalescing-operator
Armstrongest
la source
la source
Je l'ai utilisé comme une seule ligne à chargement paresseux:
Lisible? Décider vous-même.
la source
Je l'ai trouvé utile de deux manières «légèrement étranges»:
out
paramètre lors de l'écriture deTryParse
routines (c'est-à-dire retourner la valeur nulle si l'analyse échoue)Ce dernier a besoin d'un peu plus d'informations. Généralement, lorsque vous créez une comparaison avec plusieurs éléments, vous devez voir si la première partie de la comparaison (par exemple l'âge) donne une réponse définitive, puis la partie suivante (par exemple le nom) uniquement si la première partie n'a pas aidé. L'utilisation de l'opérateur de fusion nul signifie que vous pouvez écrire des comparaisons assez simples (que ce soit pour l'ordre ou l'égalité). Par exemple, en utilisant quelques classes d'assistance dans MiscUtil :
Certes, j'ai maintenant ProjectionComparer dans MiscUtil, ainsi que quelques extensions, ce qui rend ce genre de chose encore plus facile - mais c'est toujours chouette.
La même chose peut être faite pour vérifier l'égalité des références (ou la nullité) au début de l'implémentation d'Equals.
la source
Un autre avantage est que l'opérateur ternaire nécessite une double évaluation ou une variable temporaire.
Considérez ceci, par exemple:
tandis qu'avec l'opérateur ternaire, il vous reste soit:
qui appelle MyMethod deux fois, ou:
Quoi qu'il en soit, l'opérateur de fusion nul est plus propre et, je suppose, plus efficace.
la source
MyMethod()
a des effets secondaires.MyMethod()
n'a aucun effet en dehors du retour d'une valeur, le compilateur sait ne pas l'appeler deux fois, vous n'avez donc vraiment pas à vous soucier de l'efficacité ici dans la majorité des cas.MyMethod()
est une séquence enchaînée d'objets en pointillés. Ex:myObject.getThing().getSecondThing().getThirdThing()
MyMethod
sont identiques dans ce contexte, en supposant qu'ilMyMethod
s'agit d'une fonction Pure. Une autre option est la mémorisation automatique ou simplement la fermeture de la fonction dans le cache. D'autre part: en.wikipedia.org/wiki/Global_value_numberingUne autre chose à considérer est que l'opérateur coalesce n'appelle pas la méthode get d'une propriété deux fois, comme le fait le ternaire.
Il y a donc des scénarios où vous ne devriez pas utiliser ternaire, par exemple:
Si tu utilises:
le getter sera appelé deux fois et la
count
variable sera égale à 2, et si vous utilisez:la
count
variable sera égale à 1, comme il se doit.la source
??
est équivalent à?:
.Le plus grand avantage que je trouve pour l'
??
opérateur est que vous pouvez facilement convertir des types valeur nullable en types non nullable:J'utilise fréquemment ceci dans les requêtes Linq:
la source
kvp == null
. Et a enNullable<T>
fait uneGetValueOrDefault
méthode que j'utilise normalement.J'ai utilisé ?? dans mon implémentation de IDataErrorInfo:
Si une propriété individuelle est dans un état "erreur", j'obtiens cette erreur, sinon j'obtiens null. Fonctionne vraiment bien.
la source
this["Name"]
,this["Address"]
, etc ??Vous pouvez utiliser l'opérateur de fusion null pour le rendre un peu plus propre pour gérer le cas où un paramètre facultatif n'est pas défini:
la source
arg ?= Arg.Default
?J'aime utiliser l'opérateur de fusion nul pour charger paresseusement certaines propriétés.
Un exemple très simple (et artificiel) juste pour illustrer mon propos:
la source
En fait, mon expérience est que trop peu de gens sont familiers avec l'opérateur ternaire (ou plus correctement, l' opérateur conditionnel ;
?:
est «ternaire» dans le même sens qui||
est binaire ou+
est soit unaire ou binaire; il se trouve cependant être le seul opérateur ternaire dans de nombreuses langues), donc au moins dans cet échantillon limité, votre instruction échoue là.De plus, comme mentionné précédemment, il existe une situation majeure où l'opérateur de fusion nul est très utile, et c'est à chaque fois que l'expression à évaluer a des effets secondaires. Dans ce cas, vous ne pouvez pas utiliser l'opérateur conditionnel sans (a) introduire une variable temporaire, ou (b) changer la logique réelle de l'application. (b) n'est clairement pas approprié en aucune circonstance, et bien que ce soit une préférence personnelle, je n'aime pas encombrer la portée de la déclaration avec beaucoup de variables superflues, même si elles sont de courte durée, donc (a) est aussi scénario particulier.
Bien sûr, si vous devez effectuer plusieurs vérifications sur le résultat, l'opérateur conditionnel, ou un ensemble de
if
blocs, est probablement l'outil pour le travail. Mais pour le simple "si ceci est nul, utilisez-le, sinon utilisez-le", l'opérateur de fusion nul??
est parfait.la source
Une chose que j'ai beaucoup faite ces derniers temps est d'utiliser la fusion nulle pour les sauvegardes
as
. Par exemple:C'est également utile pour sauvegarder de longues chaînes
?.
qui pourraient échouerla source
Le seul problème est que l'opérateur null-coalesce ne détecte pas les chaînes vides.
c'est à dire
PRODUCTION:
Je cherche actuellement à remplacer le ?? opérateur pour contourner ce problème. Il serait certainement utile de l'intégrer dans le Framework.
Pensées?
la source
??
ne peut pas être surchargé: msdn.microsoft.com/en-us/library/8edha89s(v=vs.100).aspx - ce serait bien d'avoir une surcharge. J'utilise une combinaison:s1.Nullify() ?? s2.Nullify()
oùstring Nullify(this s)
renvoie unnull
dans les cas où la chaîne est vide.Vous devez utiliser ce qui exprime le mieux votre intention. Comme il est un opérateur coalesce null, l' utiliser .
D'un autre côté, comme il est si spécialisé, je ne pense pas qu'il ait d'autres utilisations. J'aurais préféré une surcharge appropriée de l'
||
opérateur, comme le font d'autres langages. Ce serait plus parcimonieux dans la conception du langage. Enfin bon …la source
Cool! Comptez-moi comme quelqu'un qui ne connaissait pas l'opérateur de fusion nul - c'est un truc assez sympa.
Je trouve cela beaucoup plus facile à lire que l'opérateur ternaire.
Le premier endroit qui me vient à l'esprit où je pourrais l'utiliser est de conserver tous mes paramètres par défaut au même endroit.
la source
Un peu de cas d'utilisation étrange, mais j'avais une méthode où un
IDisposable
objet est potentiellement passé en tant qu'arg (et donc supprimé par le parent), mais pourrait également être nul (et devrait donc être créé et supprimé dans la méthode locale)Pour l'utiliser, le code ressemblait soit à
Mais avec une fusion nulle devient beaucoup plus nette
la source
J'ai utilisé comme ceci:
la source