2011-11-10 15 views
9

Según MSDN: La mayoría de los tipos de referencia no deben sobrecargar el operador de igualdad, incluso si anula Igual. Sin embargo, si está implementando un tipo de referencia que pretende tener semántica de valores, como un tipo de número complejo, debe anular el operador de igualdad.¿Por qué Microsoft recomienda omitir la implementación del operador de igualdad para los tipos de referencia?

¿Cuál es la mejor práctica para implementar es igual método y la igualdad operador para una entidad de dominio típica como cliente?

En caso de que la aplicación es igual a método para devolver cierto si las identidades de dos entidades son los mismos? ¿Qué pasa si la entidad no es inmutable? ¿Qué pasa si ambas entidades son nuevas y sus identidades tienen valores vacíos? ¿Y qué hay del operador de igualdad?

Como JaredPar mencionado hereEquals realmente medirá la igualdad de los valores, mientras que == medirá si son la misma referencia o no.

+3

El enlace que has dado no muestra ese texto para mí. ¿Puedes aclarar de dónde viene? (En particular, utiliza la palabra "sobrescribir" incorrectamente cerca del final, lo que genera cierta sospecha ...) –

+0

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx – wRAR

+0

The direct [link] (http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx). Ver * Notas para los implementadores *. – Jekas

Respuesta

4

De MSDN:

mayoría de los tipos de referencia no deben sobrecargar el operador de igualdad, incluso si se anulan los Iguales. Sin embargo, si está implementando un tipo de referencia que pretende tener semántica de valores, como un tipo de número complejo, debe anular el operador de igualdad.

Microsoft cree que == debe usarse solo para tipos de valor, p. Ej. tipos de número como Complex, BigInt etc. Los tipos compuestos como Person no deben anular el operador de igualdad. Es una cuestión de código de estilo y Microsoft le sugiere que siga estas instrucciones. Dudo que el resultado compilado sea muy diferente.

+0

Ooops, en apariencia, verifiqué la casilla wiki de la comunidad :) – larsmoa

3

Normalmente, no implementaré ninguno (= operador o Equals() para mis clases, por ejemplo, Cliente).

Definitivamente no debe anular el operador = porque los desarrolladores que usan sus clases esperan = comparar los punteros y no las instancias en sí mismas, cambiar este comportamiento solo conducirá a errores porque las personas no esperan que funcione de esa manera.

Si desea incluir una forma de hacer una comparación semántica para eso está el método Equals(), y puede anularlo para implementar la verificación de igualdad de cualquier manera que tenga sentido para cómo usarlo en su código.

+0

Re: _developers que usan tus clases esperan == comparar los punteros_. De hecho: ¡el patrón 'if (param == null)' es muy frecuente! –

Cuestiones relacionadas