c# - than - ¿Cómo String.Equals(a, b) no produce una StackOverflowException?
string.equals c# (2)
Mientras examinaba el operador
String ==
, noté que llama a
String.Equals(string a, string b)
, lo que significa que es solo un paso.
Al examinar el
String.Equals(string a, string b)
, veo que realiza una comprobación de igualdad utilizando el operador
==
.
¿Cómo funciona esto realmente y no causa una
StackOverflowException
cuando se hace 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 GitHub de ILSpy.
Tu descompilador tiene un error.
El código real
no verifica
a == b
, verifica
(Object)a == (Object)b
, sin pasar por el operador sobrecargado.
Here
está el código real de Microsoft.
Operador
==
se
implementa a
s
public static bool operator == (String a, String b) {
return String.Equals(a, b);
}
operador
==
llama a
String.Equals
que se implementa
como:
public static bool Equals(String a, String b) {
if ((Object)a==(Object)b) {
return true;
}
if ((Object)a==null || (Object)b==null) {
return false;
}
if (a.Length != b.Length)
return false;
return EqualsHelper(a, b);
}
Como puede ver, la comparación para la igualdad de la cadena se realiza utilizando
if ((Object)a==(Object)b)
lanzando la cadena al
object
y luego haciendo la comparación.
Entonces esto no llamará al operador sobrecargado
==
en la clase de cadena.