and - Diferencias C#entre operator==, StringBuilder.Equals, Object.Equals y Object.ReferenceEquals
or== c# (3)
Está utilizando 4 métodos diferentes de comparación, dando como resultado diferentes resultados:
- El operador
==
hará una comprobación por defecto si las referencias son iguales. En este caso, tiene dos instancias, por lo que tienen dos referencias diferentes. El comportamiento de==
puede anularse por cualquier tipo (como unastring
tiene su propio método de comparación), pero en el caso deStringBuilder
no lo es. - Método
StringBuilder.Equals(StringBuilder)
se comparará con otro StringBuilder y comparará algunos valores internos. Estos valores son, en tu caso, lo mismo. Lo extraño es queStringBuilder
no anula el métodoStringBuilder.Equals(object)
para aplicar la misma lógica. - Método
object.Equals(object, object)
intentará llamar al método.Equals(object)
de uno de los objetos. En este caso:StringBuilder.Equals(object)
que, como dije, no tenía la lógica para comparar los valores. Resultando solo una comparación de las referencias de ambas instancias. -
Object.ReferenceEquals
simplemente comparará las referencias.
Para más información, ver:
Tengo una pregunta sobre Object.Equals
e Equals(object)
. Mi código de muestra está a continuación:
class Program
{
static void Main(string[] args)
{
var sb1 = new StringBuilder("Food");
var sb2 = new StringBuilder("Food");
Console.WriteLine(sb1 == sb2);
Console.WriteLine(sb1.Equals(sb2));
Console.WriteLine(Object.Equals(sb1, sb2));
Console.WriteLine(Object.ReferenceEquals(sb1, sb2));
Console.ReadLine();
}
}
El resultado es:
False
True
False
False
Pero en lo que a mí respecta, Object.Equals(sb1, sb2)
llama internamente a sb1.Equals(sb2)
entonces ¿por qué da dos resultados diferentes?
StringBuilder.equals no compara los objetos, sino más bien desde Equals(StringBuilder) :
"Verdadero si esta instancia y sb tienen valores de cadena , Capacidad y Máx. De capacidad iguales ; de lo contrario, son falsos".
El resto de los controles que está haciendo compara la referencia.
Te estás perdiendo otra prueba:
Console.WriteLine(sb1.Equals((object)sb2)); // False!
StringBuilder no anula Equals(object)
, lo sobrecarga con otro Equals(StringBuilder)
.
Object.Equals(object, object)
llama a Equals(object)
, por lo que el resultado es falso.