viernes, 29 de julio de 2016

Comparación de Igualdad en C# | Parte 5/5 | Personalización de los Tipos de Igualdad: Sobrecarga de Operadores == y !=, y Ejemplo de Implementación de IEquatable

Índice

1. Introducción
2. Palabras Clave
3. Sobrecarga Operadores == y !=
4. Implementación de la Interfaz IEquatable<T>
4.1 Generalidades
4.2 Ejemplo de uso
4.3 Comparadores de igualdad enchufables
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

Esta serie finaliza con el tema de sobrecarga operadores de igualdad de C#: == y !=, la guía básica de implementación y referencia de la interfaz IEquatable<T>, y al final un ejemplo que demuestra cómo construir la estructura Area, la cual implementa IEquatable<T>: la idea principal es ilustrar un caso donde la semántica de comparación de igualdad tiene un sentido de contexto particular.

2. Palabras Clave

  • Comparación de igualdad
  • Estructura
  • Interfaz IEquatable<T>
  • Operador ==
  • Operador !=
  • Semántica de equivalencia
  • Sobrecarga

3. Sobrecarga Operadores == y !=

En el artículo anterior -Comparación de Igualdad en C# | Parte 4/5 | Igualdad y Tipos de Datos Personalizados: Aspectos Generales-, se estudió el proceso de sobrescritura del método Equals para cambiar la semántica de la comparación de igualdad para un tipo de dato específico; de manera análoga, el programador puede sobrecargar los operadores == y != para crear una lógica de comparación de igualdad para tipos de datos struct.

Para clases existen dos maneras de proceder (Albahari J., 2012)
  • No modificar el comportamiento de == y != de tal forma que se conserve la comparación de igualdad referencial.
  • Sobrecargar los operadores == y != acorde con el método Equals. [Esto se demuestra con la sección 4.2.]
Por ejemplo para la clase StringBuilder, los operadores == y != siguen una semántica de igualdad como en otros tipos de datos por referencia; esto no es así con Equals: compara el contenido literal de la instancia.

En el siguiente ejemplo de uso se demuestra cómo los operadores en cuestión aún se usan para comparar referencias y el método Equals ha sido sobrescrito para comparar valores y no referencias a objetos: 

Ejemplo de uso

var sb1 = new StringBuilder("Uniandes");
var sb2 = new StringBuilder("Uniandes");

Console.WriteLine(sb1 == sb2); // Fasle - Igualdad por referencia
Console.WriteLine(sb1.Equals(sb2)); // True - Igualdad por valor

Es evidente que se ha de entender correctamente el concepto de equivalencia acorde a la naturaleza del tipo de dato. Algunas preguntas a responder para determinar su semántica de comparación de igualdad podrían ser: 
  • ¿Cuál es la manera más natural de efectuar la comparación entre los valores de dos entidades del mismo tipo?
  • ¿Cuál de las alternativas consideradas resulta menos ambigua?

4. Implementación de la Interfaz IEquatable<T>

4.1 Generalidades

En la sección 4 del artículo Comparación de Igualdad en C# | Parte 3/5 | Protocolos de Igualdad Estándar: Método static object.ReferenceEquals e Interfaz IEquatable se describe los básicos sobre esta interfaz y un ejemplo introductorio de su uso. Sin embargo, vale reiterar que gracias a su propiedad de genericidad no es requerido efectuar la técnica de boxing, lo que si ocurre con el método Object.Equals(Object) (Albahari J., 2012).

4.2. Ejemplo de uso

Este ejemplo de uso demuestra cómo implementar una estructura para la representación del área con medidas intercambiables: altura por ancho es equivalente ancho por altura.

Ejemplo de uso

Líneas a resaltar de este código: 
  • Líneas 27-39: Sobrescribe el método Object.Equals(Object). Primero se evalúa que el argumento corresponde con una instancia de Area; de no ser así, se retorna false, en caso contrario se invoca la implementación de Equals(Area).
  • Líneas 42-46: Implementa el método Equals de la interfaz IEquatable<T>. Aquí se comprueba la igualdad de cada uno de los campos de la estructura: Medida1 y Medida2.
Además de esta sobrescritura e implementación del método Equals de la interfaz IEquatable<T>, se sobrescribe los operadores == y !=
  1. Líneas 55-58: Para la comparación de igualdad de dos instancias con el operador ==, se invoca al método Equals implementado de la interfaz mencionada.
  2. Líneas 62-65: Análogo al anterior; para la comparación de diferencia, el operador != es sobrecargado.
Una vez ejecutado este código en LINQPad, este es el resultado obtenido: 

False
True
True
True

4.3 Comparadores de igualdad enchufables

En las series próximas de artículos dedicadas al trabajo con colecciones se introducirá la interfaz IEqualityComaparer. Esta interfaz es útil para especificar una semántica de igualdad distinta para escenarios específicos.

5. Conclusiones

Esta serie ha resultado de importante estudio para comprender los conceptos elementales detrás de la comparación de igualdad. Futuras publicaciones entrarán en más detalle en este interesante y retador tema. Ahora resta al programador considerar ir más a fondo y explorar la oportunidad que puede hallarse a la hora de escribir tipos de datos consistentes con un contexto de realidad específico.

La próxima serie de artículos C# describe la comparación de orden.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Comparación de Igualdad en C# | Parte 4/5 | Igualdad y Tipos de Datos Personalizados: Aspectos Generales (2016, julio 29). Recuperado desde: https://ortizol.blogspot.com/2016/07/comparacion-de-igualdad-en-csharp-parte-4-5-igualdad-y-tipos-de-datos-personalizados-aspectos-generales.html
Comparación de Igualdad en C# | Parte 3/5 | Protocolos de Igualdad Estándar: Método static object.ReferenceEquals e Interfaz IEquatable (2016, julio 29). Recuperado desde: https://ortizol.blogspot.com.co/2016/07/comparacion-de-igualdad-en-csharp-parte-3-5-protocolos-de-igualdad-estandar-metodo-static-object.referenceequals-e-interfaz-iequatable-t.html


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.