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 unastringtiene su propio método de comparación), pero en el caso deStringBuilderno 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 queStringBuilderno 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.ReferenceEqualssimplemente 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.