2009-10-02 23 views
7

Veo el punto en implementar explícitamente Equals y GetHashCode para mis objetos.Implementación del operador de igualdad explícita C# necesaria

Pero me pregunto si tiene algún sentido a aplicar también de forma explícita el == y = operadores como este:

public static bool operator ==(Salutation left, Salutation right) 
{ 
    return Equals(left, right); 
} 

¿El C# No utilice automáticamente el método Equals cuando se invoca ==?

Respuesta

8

Efectivamente tiene sentido anular el operador de igualdad junto con Equals. De hecho, es muy recomendable.

Microsoft ha publicado oficialmente Guidelines for Implementing Equals and the Equality Operator (==) en MSDN. Definitivamente seguiría la práctica recomendada allí. Los dos puntos principales son:

  • implementar el método GetHashCode Siempre que implemente los Iguales método. Esto mantiene Equals y GetHashCode sincronizado.
  • Reemplace el método Equals siempre que implemente el operador de igualdad (==) y haga que hagan lo mismo. Esto permite que el código de infraestructura como Hashtable y ArrayList, que usan el método Equals, se comporten de la misma manera como código de usuario escrito utilizando el operador de igualdad .

Jon Skeet también escribió un useful MSDN blog post sobre el tema, que resume cómo Equals y el trabajo == operador por defecto en los tipos de referencia/valor.

Las partes más importantes se citan a continuación:

El método equals es sólo un Portal definido en System.Object, y anulado por lo que las clases eligen para hacerlo. El operador == es un operador que puede estar sobrecargado por las clases , pero que generalmente tiene un comportamiento de identidad .

Para los tipos de referencia, donde == no ha sido sobrecargado, si se compara dos referencias se refieren al mismo objeto - que es exactamente lo que la aplicación de Iguales hace en System.Object.

Los tipos de valores no proporcionan una sobrecarga para == de forma predeterminada. Sin embargo, la mayoría de los tipos de valor proporcionados por el marco proporcionan su propia sobrecarga. La implementación predeterminada de Iguales para un tipo de valor es proporcionado por ValueType, y utiliza la reflexión para hacer la comparación, lo que hace que sea significativamente más lento que una implementación específica del tipo normalmente sería . Esta implementación también llama a Igual a los pares de referencias dentro de los dos valores que se comparan.

+0

Gracias. Acepté tu respuesta, pero ¿podrías editar alguna de las cosas que dijo Joel? Cómo == se comporta si no se reemplaza. – Tigraine

+0

@Tigraine: No hay problema. En realidad, lo que dice Joel (y mucho más) se menciona en la página a la que me he vinculado, escrita por Jon Skeet. Citaré eso si quieres. – Noldorin

+0

Gracias .. :) Simplemente es más fácil de leer de esta manera;) – Tigraine

2

Si no lo sobrecarga, == solo verifica la igualdad de referencia: ¿ambas partes se refieren al mismo objeto?

Si necesita igualdad de valores (¿los diferentes objetos en ambos lados tienen el mismo valor?), Puede sobrecargar el operador. En este punto, casi siempre quiere sobrecargar .Equals() y .GetHashCode() también y simplemente tiene su == llamada de sobrecarga .Equals().

Cuestiones relacionadas