En utilisant == ou .Equals () pour la comparaison booléenne
J'ai relu un peu de code, et j'ai trouvé quelque chose qui ressemblait à ceci:
public class MyClass
{
public bool IsEditable { get; set; }
public void HandleInput()
{
if (IsEditable.Equals(false))
{
//do stuff
}
}
}
Autant que je sache, (IsEditable.Equals(false))
est identique à (IsEditable == false)
(et aussi le même que (!IsEditable)
).
En plus de la préférence personnelle, quelle est la différence entre .Equals()
et ==
spécifiquement lorsqu'il est utilisé pour comparer bool
s?
source d'informationauteur Ryan Kohn
Vous devez vous connecter pour publier un commentaire.
La
Equals
voie semble être beaucoup plus lent - environ 2,7 fois en mode debug, et plus de sept fois en mode release.Voici ma rapide et sale de référence:
L'exécution de ce produit les résultats suivants:
En mode debug
En mode release
Equals
semble être le plus lent. Il semble y avoir peu de différence entre==
et!=
. Cependant,if (!boolExpr)
semble être le gagnant clair.C'est surtout un problème de lisibilité. Je serais normalement utiliser
==
parce que c'est ce que je suis habitué à regarder.Spécifiquement avec des booléens, vous n'avez pas à les comparer à tous les
suffira
bien que, Parfois, je me dois d'écrire des choses comme
if (val == false)
juste pour être certain que je n'ai pas mal lu quand j'ai modifier le code.En fait, pour les types de base tels que
int
bool
etc. il y a une différence entre un appelEquals()
et==
en raison du fait que le CIL a des instructions pour la manipulation de ces types. L'appel deEquals()
forces de boxe de la valeur et de faire une méthode virtuelle d'appel, considérant que l'utilisation de==
conduit à l'utilisation d'un seul CIL instruction.!value
etvalue == false
est en fait le même, au moins dans Microsoft du compilateur C# livré avec .NET 4.0.Par conséquent, les comparaisons à l'intérieur de l'méthodes suivantes
de compiler à la suite de CIL instructions:
Si vous décompiler Système.Boolean et la regarde, elle est Égale surcharges sont définies ainsi:
J'aime à penser que le compilateur C# de l'optimiseur et de la .Net compilateur JIT serait assez intelligent pour inline, au moins pour libération/optimisé de compilations, de faire exactement la même.
Prendre un coup d'oeil à la citation suivante Prises à partir d'ici:
Donc, en bref,
Equals
est vraiment juste faire une == de toute façon.Dans ce cas, avec des booléens, il ne fait aucune différence, mais avec d'autres intégrée non des types référence.
==
permet les conversions de types si l'on peut.Equals
ne==
est toujours mieux que.Equals
. Dans le cas de la comparaison des entiers,==
court plus vite que.Equals
. Dans le test ci-dessous, le temps écoulé à l'aide de==
157, tandis que pour.Equals
le temps écoulé est de 230.