2009-09-20 13 views
21

Digamos que tiene dos clases diferentes donde cada una tiene su propia implementación de Equals; ¿Cuál se usa? ¿Qué pasa si solo uno de ellos tiene uno? ¿O ninguno de ellos? ¿Alguna de las siguientes líneas es equivalente?C#: ¿Cómo funciona el objeto estático.Equals comprobar la igualdad?

object .Equals(first, second) 
first .Equals(second) 
second .Equals(first) 

que supongo que los dos primeros podrían ser equivalentes, pero en realidad no tiene ni idea.

¿Qué es lo que realmente hace?

Respuesta

40

Básicamente hace tres cosas:

  • comprobar la igualdad de referencia (return true si es así)
  • Registro de nulidad de referencia (return false si bien el valor es nulo; por ahora la hipótesis nula == nulo caso se ha manejado)
  • comprobar la igualdad de valor con first.Equals(second)

El pedido no debe importa si ambos los valores tienen implementaciones de igualdad que se comportan bien, ya que la igualdad debe implementarse de manera que x.Equals(y) implica y.Equals(x). Sin embargo, la documentación fuera de línea que tengo instalada indica que first.Equals (second) (u objA.equals (objB) para usar el nombre real de los parámetros) está especificado. El online documentation no menciona esto, curiosamente.

sólo para hacer todo esto concreto, la aplicación podría tener este aspecto:

public static bool Equals(object x, object y) 
{ 
    if (x == y) // Reference equality only; overloaded operators are ignored 
    { 
     return true; 
    } 
    if (x == null || y == null) // Again, reference checks 
    { 
     return false; 
    } 
    return x.Equals(y); // Safe as we know x != null. 
} 
+1

Cabe destacar que la principal diferencia entre el 'Object.Equals' estático y el' first.Equals (second) virtual 'es que el último ** fallará ** si' first' es una referencia nula. –

1

Por defecto, el objeto de equivalencia se determina por la dirección del objeto en la memoria. Si ambas instancias tienen la misma dirección de memoria, son iguales.

Sin embargo, esto puede ser sobrecargado dentro del objeto de modo que los desarrolladores pueden comparar dos objetos que ar no en la misma posición de memoria y todavía ser considerados iguales. Por ejemplo, si tiene una Capa de acceso a datos en la que cada objeto tiene su ID de registro de datos de la base de datos, puede comparar los valores de los objetos en función de la ID.

Puede overload operators para producir esta funcionalidad.

+0

No puede anular operadores en C#. Puede * sobrecargar * operadores o * anular * el método Equals. –

+0

Gracias, lo arreglaron. – Soviut

Cuestiones relacionadas