referencias programar programacion posible para numeros lenguaje intencionada funcion cómo comparar comparacion codigos basicos c#

programar - posible comparacion de referencias no intencionada c#



¿Cuál es el comparador de igualdad predeterminado para un tipo de conjunto? (2)

De forma predeterminada, delegará en EqualityComparer<T>.Default . Esto devuelve un comparador que puede comparar dos objetos de tipo T

Para una clase personalizada, esto hace algunas cosas en este orden:

  • Si la clase implementa IEquatable<T> , delegará en la implementación de la clase de esta interfaz.
  • Si la clase tiene un método Equals definido, usará ese
  • Como último recurso, utilizará la igualdad de referencia.

En la API de MSDN para el constructor de HashSet sin argumentos, declara

Inicializa una nueva instancia de la clase HashSet que está vacía y usa el comparador de igualdad predeterminado para el tipo de conjunto.

¿Cuál es el comparador de igualdad predeterminado para el tipo de conjunto, por ejemplo, para una clase personalizada?

BTW: ¿Soy yo o la documentación de la API de MSDN es un poco escasa en explicaciones? Me tropiezo con estas preguntas más de una vez cuando lo leo.


Significa que usará el comparador devuelto por EqualityComparer<T>.Default para el tipo de elemento T del conjunto.

Como indica la documentación:

La propiedad predeterminada verifica si el tipo T implementa la interfaz System.IEquatable y, si es así, devuelve un EqualityComparer que usa esa implementación. De lo contrario, devuelve un EqualityComparer que usa las anulaciones de Object.Equals y Object.GetHashCode proporcionado por T.

Por lo tanto, para su tipo personalizado, utilizará el método GetHashCode que ha definido para ubicar elementos en el conjunto. Si ha implementado IEquatable<T> , utilizará IEquatable<T>.Equals(T) para la igualdad, de lo contrario, usará su método de Igualdad Equals(object) . Por defecto, este método hace referencia a la igualdad como se define en la clase de object . Por lo tanto, si está definiendo la igualdad con cualquiera de los dos métodos, debe asegurarse de que también anula GetHashCode también.