Question

Je l'ai regardé autour un peu et ne l'ai pas trouvé une question équivalente.
Est-ce une mauvaise pratique de codage? Je peux lire facilement, mais est-ce trop cryptique pour quelqu'un lire le code?

bool? testBool = null;  
string result;  
result = (testBool ?? false ? "Yes" : "No");  

Modifier: Mes excuses à tout le monde pour un code horrible! Voici un exemple de travail ..
Je suis un peu dépassé par la vitesse des réponses. J'allais supprimer ce et le faire bien, mais déjà eu 4 réponses!

Était-ce utile?

La solution

Je parenthéser préciser si ce qui se passe -. Par exemple

bool? testbool = null;
string result;
result = (testbool ?? false) ? "Yes" : "No";

Avec cela, je serais bien avec elle. Sans elle, je devais l'étudier un peu pour comprendre ce qui se passait (si elle compile même - je ne sais pas l'ordre des opérations du haut de ma tête pour: contre ??)

Autres conseils

Il est un peu sur le côté cryptique, il est même pas évident si l'expression est évaluée comme:

string result = (testbool ?? false) ? "Yes" : "No";

ou

string result = testbool ?? (false ? "Yes" : "No");

Vous pouvez utiliser la méthode GetValueOrDefault du type nullable au lieu de l'opérateur ?? pour le rendre plus lisible:

bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");

EDIT: La question originale a utilisé un int?. Il est maintenant fixé.

Ce code ne sera pas même compilation, donc oui, je dirais qu'il est trop cryptique.

Typos mis à part, le fait que vous avez publié sans facilement spotting qu'il ya un problème (vous essayez d'utiliser un bool sur la partie droite de l'??, lorsque le LHS est un int?) suggère que ce n'est pas une bonne idée même si vous l'obtenez droit.

Je dois voir un exemple dans le monde réel, mais je pense que je l'avais habituellement découpé dans une déclaration en utilisant l'opérateur coalescent null, puis un autre en utilisant l'opérateur conditionnel. Une autre est d'utiliser le comportement des types nullables par rapport aux opérateurs ... mais encore une fois, c'est raisonnablement obscure. (Je viens de me rappeler exactement ce que le comportement est!)

J'aime l'opérateur coalescent nulle en général, mais je pense que la combinaison avec l'opérateur conditionnel fait juste un peu à obscurcir. Je pense que je serais probablement l'accepte dans un cas où il y avait un avantage important pour qu'il soit une seule expression (par exemple pour l'initialisation où l'alternative est l'introduction d'une méthode supplémentaire), mais en général je préfère scinder en deux déclarations.

EDIT: Une alternative à ce cas particulier est de comparer juste contre « vrai » - qui semble redondant, mais pas dans le cas de bool?:

result = (testBool == true) ? "Yes" : "No";

Les parenthèses ne sont pas nécessaires, bien sûr, mais ajoutent la clarté de l'OMI.

Je pense que cela est plus simple: le résultat est que « Oui » si testBool est en fait vrai; sinon il est « Non ». Si vous vouliez « par défaut » Oui, vous écririez:

result = (testBool == false) ? "No" : "Yes";

Enveloppez et je pense qu'il est très bien.

string result = (testbool ?? false) ? "Yes" : "No";

Dans le cas contraire l'ordre prévu des opérations, même si cela fonctionne, n'est pas évident.

(Edit:. Jonathan m'a battu par une pincée)

devrait-il pas être

bool? testbool = null;

Je trouve pas besoin d'utiliser un annulable ici. Cela me fait penser à deux fois, donc je coder vraiment comme

bool testbool = false;
string result;
result = testbool ? "Yes" : "No";

Je ne sais pas si votre exemple était incomplète, mais je pense que l'initialisation de la variable à la valeur par défaut est Saner que d'utiliser un annulable, puis le ?? opérateur de définir la valeur après la déclaration.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top