2009-10-06 16 views
6

Al implementar un operador ==, tengo la sensación de que me faltan algunos puntos esenciales.
Por lo tanto, estoy buscando algunas mejores prácticas en torno a eso.
Aquí hay algunas preguntas relacionadas estoy pensando:¿Cuáles son las mejores prácticas para implementar el operador == para una clase en C#?

  • cómo manejar limpiamente la comparación de referencia?
  • supuesto de que se ejecuta a través de una interfaz -como IEquatable<T>? O anulando object.Equals?
  • ¿Y el operador !=?

(esta lista puede no ser exhaustiva).

+3

Comprobar estos hilos: http://stackoverflow.com/questions/962960/equals-method-implementation-helpers-c, http://stackoverflow.com/questions/1421289/icomparable-and-equals, http://stackoverflow.com/questions/660566/override-equals-and-gethashcode-question, http://stackoverflow.com/questions/567642/how-to-best-implement-equals-for-custom-types – Groo

Respuesta

11

yo seguiría Microsoft de Guidelines for Overloading Equals() and Operator ==.

edición: las directrices de Microsoft contiene esta observación importante, lo que parece confirmar la respuesta de Henk:

== operador imperativa de tipos no inmutables no se recomienda.

3
  • Si implementa ==, anular y .equals. GetHashCode
  • poner en práctica! =, Así
  • Compruebe si hay referencias nulas utilizando object.ReferenceEquals caso contrario el operador recursivo
+2

En realidad, TENGO que implementar! = También, de lo contrario, C# no le permitirá compilar. –

+0

Buen punto. Olvidé eso. – dkackman

4

Cada vez que se implementa el operador ==, asegúrese también de poner en práctica !=, IEquatable<T> y anular Object.Equals() y Object.GetHashCode() para la coherencia para el usuario de su clase.

Teniendo en cuenta una clase, aquí está mi aplicación habitual:

public bool Equals(MyClass other) { 
     if (ReferenceEquals(other, null)) 
      return false; 
     if (ReferenceEquals(other, this)) 
      return true; 
     return // your equality code here 
    } 

    public override bool Equals(object obj) { 
     return Equals(obj as MyClass); 
    } 

    public override int GetHashCode() { 
     return // your hash function here 
    } 

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

    public static bool operator !=(MyClass left, MyClass right) { 
     return !(left == right); 
    } 
+0

Esto. Además, si implementa inicialmente un operador <(menor que), puede usar ese operador solo para implementar cada uno de los otros operadores. es decir: == se puede expresar como! (left

4

El enfoque más común es no para manejarlo. El valor predeterminado es la comparación de referencia que, en general, es adecuada para objetos de clase.

Así que primero quieren estar muy seguro de lo que necesita el comportamiento del tipo de valor.

+2

Deje que haya una respuesta clara a la pregunta en lugar de consejos para decirle a alguien que cambie la forma en que hace las cosas. –

0

Uso Resharper para tales tareas. No tiene sentido reinventar la rueda.

+1

Esa es una solución costosa para una tarea tan trivial – spender

+1

Además, para algunas tareas, como esta, preferiría que un desarrollador * aprendiera a hacer algo correctamente * que hacer que alguna herramienta le haga el trabajo, y nunca lo pensé de nuevo. –

+0

@spender Estoy seguro de que sabe que R # puede usarse no solo para tareas tan triviales. @Mike Deberían poder escribir esto a mano, pero también deberían tener herramientas para ser más productivos y no tener que escribirlo. –

Cuestiones relacionadas