Bei der Untersuchung des String ==
Bedieners habe ich festgestellt, dass er anruft String.Equals(string a, string b)
, was bedeutet, dass es sich nur um einen Durchgang handelt.
Wenn String.Equals(string a, string b)
ich die Methode untersuche, sehe ich, dass sie eine Gleichheitsprüfung mit dem ==
Operator durchführt. Wie funktioniert das eigentlich und verursacht keine, StackOverflowException
wenn man so etwas wie "x" == "x"
oder macht "x" == "y"
?
Update : Ich habe JetBrains informiert und sie haben es zu einer kritischen Priorität für dotPeek gemacht. https://youtrack.jetbrains.com/issue/DOTP-6789
Ich habe auch ein Problem im GitHub-Repo von ILSpy hinzugefügt.
a == b
), in VB.NET jedoch korrekt :a Is b
.Antworten:
Ihr Dekompiler hat einen Fehler. Der echte Code
a == b
prüft nicht , er prüft(Object)a == (Object)b
und umgeht den überladenen Operator.quelle
object.ReferenceEquals(a,b)
wäre viel klarer ..object.ReferenceEquals
mit der Gussversion (zB was , wenna
istnull
?), Und so lange , wie Sie wissen , was Casting ist, ist es sicherlich nicht verschleiert.(Object)a == (Object)b
undObject.ReferenceEquals(a, b)
ungefähr gleich lesbar, aber es würde mich nicht überraschen, wennObject.ReferenceEquals(a, b)
nur eine geringe Chance besteht, nicht inline zu werden, wenn die maximale Inline-Tiefe erreicht ist. MS führt viele Mikrooptimierungen durch, da die meisten engen Schleifen im Benutzercode MS-Code aufrufen.Hier ist der echte Code von Microsoft. Operator
==
ist a s implementiertOperatoraufrufe
==
,String.Equals
die implementiert sind als:Wie Sie sehen, wird der Vergleich für die Zeichenfolgengleichheit durchgeführt,
if ((Object)a==(Object)b)
indem die Zeichenfolge in umgewandeltobject
und dann der Vergleich durchgeführt wird. Dadurch wird der überladene Operator==
in der Zeichenfolgenklasse nicht aufgerufen .quelle