classFoo{publicboolSomeBool{ get;set;}}classProgram{staticvoidMain(string[] args){var foo =MaybeFoo();var bar = foo !=null&& foo.SomeBool;}staticFooMaybeFoo(){returnnewRandom().Next()<10?null:newFoo();}}
Ici MaybeFoo est une méthode qui retourne parfois null et retourne parfois un Foo. J'ai utilisé Random de sorte que R# n'est pas automatiquement que c'est toujours la valeur null ou not null.
Maintenant, comme vous le dites sur cette ligne:
var bar = foo !=null? foo.SomeBool:false;
R# offre l'inspection Simplifier l'opérateur conditionnel. Que faut-il dire par là? Eh bien, comme d'habitude, on peut Alt+Entrée et accepter la suggestion et de voir ce qu'il veut et de le remplacer avec de l', qui dans ce cas est:
var bar = foo !=null&& foo.SomeBool;
Maintenant, à votre préoccupation:
Mais je me sens comme un null est nécessaire de vérifier ici, depuis FirstOrDefault() peut retourner null.
Donc, qui a tort, moi ou Resharper?
Bien, pour le dire en peu de temps, vous l'êtes. Il y a encore une valeur null vérifier qui a lieu ici, et la && de l'opérateur est de court-circuitde sorte que le deuxième opérande (foo.SomeBool) sera évaluée uniquement si le premier est true. Donc il n'y aura pas un NullReferenceException dans le cas où foo est null; la première vérification échoue et bar sera attribué false.
De sorte que les deux lignes
var bar = foo !=null? foo.SomeBool:false;
et
var bar = foo !=null&& foo.SomeBool;
sont sémantiquement équivalentet R# comme d'habitude préfère la version la plus concise (en particulier, explicite trues et falses dans des conditions sont souvent une marque de code redondant). Vous ne pouvez pas, auquel cas, vous pouvez désactiver cette inspection.
9
ReSharper suggère de modifier votre code pour:
var bar = foo !=null&& foo.SomeBool;
Qui fait exactement la même chose que ternaire de l'opération, mais regarde mieux. La logique de ton code ne change pas.
Tout d'abord, un exemple complet:
Ici
MaybeFoo
est une méthode qui retourne parfoisnull
et retourne parfois unFoo
. J'ai utiliséRandom
de sorte que R# n'est pas automatiquement que c'est toujours la valeur null ou not null.Maintenant, comme vous le dites sur cette ligne:
R# offre l'inspection Simplifier l'opérateur conditionnel. Que faut-il dire par là? Eh bien, comme d'habitude, on peut Alt+Entrée et accepter la suggestion et de voir ce qu'il veut et de le remplacer avec de l', qui dans ce cas est:
Maintenant, à votre préoccupation:
Bien, pour le dire en peu de temps, vous l'êtes. Il y a encore une valeur null vérifier qui a lieu ici, et la
&&
de l'opérateur est de court-circuitde sorte que le deuxième opérande (foo.SomeBool
) sera évaluée uniquement si le premier esttrue
. Donc il n'y aura pas unNullReferenceException
dans le cas oùfoo
estnull
; la première vérification échoue etbar
sera attribuéfalse
.De sorte que les deux lignes
et
sont sémantiquement équivalentet R# comme d'habitude préfère la version la plus concise (en particulier, explicite
true
s etfalse
s dans des conditions sont souvent une marque de code redondant). Vous ne pouvez pas, auquel cas, vous pouvez désactiver cette inspection.ReSharper suggère de modifier votre code pour:
Qui fait exactement la même chose que ternaire de l'opération, mais regarde mieux. La logique de ton code ne change pas.