En examinant l' String ==
opérateur, j'ai remarqué qu'il appelle String.Equals(string a, string b)
, ce qui signifie que c'est juste un pass-through.
En examinant la String.Equals(string a, string b)
méthode, je vois qu'elle effectue un contrôle d'égalité à l'aide de l' ==
opérateur. Comment cela fonctionne-t-il réellement et ne cause-t-il pas une action StackOverflowException
comme "x" == "x"
ou "x" == "y"
?
Mise à jour : j'ai informé JetBrains et ils en ont fait une priorité essentielle pour dotPeek. https://youtrack.jetbrains.com/issue/DOTP-6789
J'ai également ajouté un problème sur le dépôt GitHub d'ILSpy.
a == b
), mais correct en VB.NET:a Is b
.Réponses:
Votre décompilateur a un bogue. Le vrai code ne vérifie pas
a == b
, il vérifie(Object)a == (Object)b
, en contournant l'opérateur surchargé.la source
object.ReferenceEquals(a,b)
serait beaucoup plus clair ..object.ReferenceEquals
la version de la distribution (par exemple, quea
se passe-null
t-il si c'est ?), Et, tant que vous savez ce qu'est la distribution, elle n'est certainement pas obscurcie.(Object)a == (Object)b
et àObject.ReferenceEquals(a, b)
peu près tout aussi lisible, mais cela ne me surprendrait pas siObject.ReferenceEquals(a, b)
juste une légère chance de ne pas être en ligne si la profondeur maximale en ligne est atteinte. MS fait beaucoup de micro-optimisations, car la plupart des boucles serrées dans le code utilisateur finissent par appeler du code MS.Voici le vrai code de Microsoft. L'opérateur
==
est implémenté un s==
appels d' opérateurString.Equals
qui sont implémentés comme:Comme vous le voyez, la comparaison pour l'égalité des chaînes est effectuée en utilisant le
if ((Object)a==(Object)b)
cast de la chaîne enobject
puis en effectuant la comparaison. Donc, cela n'appellera pas l'opérateur surchargé==
dans la classe de chaînes.la source