Están pasando varias cosas. En primer lugar, en este ejemplo:
string s1 = "a";
string s2 = "a";
Console.WriteLine(s1 == s2);
Usted afirma que:
ambos son diferentes referencia de objeto.
Eso no es cierto debido a cadena de internamiento.s1
y s2
son referencias al mismo objeto. Las garantías C# especificación que - de la sección 2.4.4.5 de la especificación C# 4:
Cuando dos o más cadenas literales que son equivalentes de acuerdo con el operador de igualdad cadena (§7.10.7) aparecen en el mismo programa, estos literales de cadena se refieren a la misma instancia de cadena.
Así que en este caso particular, a pesar de ello obtener "verdadera", incluso si imprimió object.ReferenceEquals(s1, s2)
, o si lo hizo usar una comparación verdadera identidad de referencia con ==
:
object s1 = "a";
object s2 = "a";
Console.WriteLine(s1 == s2); // Still prints True due to string literal interning
Sin embargo, incluso si estos eran referencias a objetos separados, ==
es sobrecargado para string
. La sobrecarga es una decisión en tiempo de compilación - la implementación a usar depende de los tipos de tiempo de compilación de los operandos. Así, por ejemplo:
string a = new string('x', 1);
string b = new string('x', 1);
Console.WriteLine(a == b); // Uses string's implementation, prints True
object c = a;
object d = b;
Console.WriteLine(c == d); // Reference identity comparison, prints False
compararlo con object.Equals(object)
que es un método virtual. Como sucede, String
sobrecarga este método así como, pero lo que es más importante lo anula. Así que si cambiamos nuestro código a:
string a = new string('x', 1);
string b = new string('x', 1);
Console.WriteLine(a.Equals((object) b));
object c = a;
object d = b;
Console.WriteLine(c.Equals(d));
... entonces tanto las llamadas de método en el código compilado simplemente habrá que object.Equals(object)
, pero van a todavía tanto impresos verdadera causa de polimorfismo: la puesta en práctica de String
se utilizará.
Esto es lo que una llamada a la sobrecarga método se vería así:
string a = new string('x', 1);
string b = new string('x', 1);
Console.WriteLine(a.Equals(b)); // Calls string.Equals(string)
Dos preguntas: ¿por qué el molde de 'd' a' object', ya que ya es un objeto? Además, en la parte 'a Igual b ', yo llamaría tanto a la anulación de objeto como a la sobrecarga de cadena, por lo que es más claro cuál es la diferencia. – doekman
@doekman: 1) Sí, no necesito el yeso en ese caso. 2) No estoy seguro de lo que quieres decir. –
Quiero decir esto: ver el último informe. No recibí tu explicación directamente sobre sobrecarga/anulación ... – doekman