Mientras examinaba al String ==
operador, noté que llama String.Equals(string a, string b)
, lo que significa que es solo un paso.
Al examinar el String.Equals(string a, string b)
método, veo que realiza una comprobación de igualdad utilizando el ==
operador. ¿Cómo funciona esto realmente y no causa un problema StackOverflowException
al hacer algo como "x" == "x"
o "x" == "y"
?
Actualización : se lo hice saber a JetBrains y lo convirtieron en una prioridad crítica para dotPeek. https://youtrack.jetbrains.com/issue/DOTP-6789
También agregué un problema en el repositorio de GitHub de ILSpy.
a == b
), pero correcto en VB.NET:a Is b
.Respuestas:
Tu descompilador tiene un error. El código real no verifica
a == b
, verifica(Object)a == (Object)b
, sin pasar por el operador sobrecargado.fuente
object.ReferenceEquals(a,b)
sería mucho más claro ..object.ReferenceEquals
de la versión de transmisión (por ejemplo, ¿quéa
pasa si es asínull
?) Y, siempre que sepa qué es la transmisión, ciertamente no está ofuscado.(Object)a == (Object)b
yObject.ReferenceEquals(a, b)
es igualmente legible, pero no me sorprendería siObject.ReferenceEquals(a, b)
solo tuviera una pequeña posibilidad de no estar en línea si se alcanza la profundidad máxima en línea. MS hace muchas micro optimizaciones, ya que la mayoría de los bucles estrechos en el código de usuario terminan llamando al código de MS.Aquí está el código real de Microsoft. El operador
==
se implementa a s==
llamadas de operadorString.Equals
que se implementa como:Como puede ver, la comparación para la igualdad de la cadena se realiza mediante la
if ((Object)a==(Object)b)
conversión de la cadenaobject
y luego la comparación. Entonces esto no llamará al operador sobrecargado==
en la clase de cadena.fuente