c# - Anulación de GetHashCode
gethashcode c# (6)
Esta pregunta ya tiene una respuesta aquí:
Como sabe, GetHashCode devuelve un valor semi-único que se puede usar para identificar una instancia de objeto en una colección. Como buena práctica, se recomienda anular este método e implementar el suyo propio.
Mi pregunta es: ¿anulas este método cuando trabajas en objetos personalizados? Si es así, ¿qué algoritmo utilizas para generar la identificación única?
Estaba pensando en generar un GUID y luego obtener datos enteros de ese identificador.
Cuando anula GetHashCode()
también debe anular Equals()
, operator==
y operator!=
. Y tenga mucho cuidado de cumplir con todos los requisitos para esos métodos.
Las pautas están aquí en MSDN . Cita más importante:
No es una buena idea anular operador == en tipos no inmutables.
En general, uso el GetHashCode agregado a partir de las propiedades del componente de la clase. P.ej
public class Test
{
public string Text { get; set; }
public int Age { get; set; }
public override GetHashCode()
{
int result =
string.IsNullOrEmpty(Text) ? 0 : Text.GetHashCode()
+ Age.GetHashCode();
return result;
}
}
En mi uso personal, solo anulo cuando se reemplaza el método igual. En general, hago esto para los objetos que sé que podría ejecutar una consulta de LINQ to Objects, u otra operación de comparación.
Normalmente devuelvo, si digo un objeto LINQ to SQL o DTO, el valor de la clave primaria. Cualquier cosa que devuelva, si no almacena el valor localmente, puede producir un resultado inesperado.
HTH.
Normalmente anularía los métodos de control de igualdad y código hash para las clases de datos (es decir, las clases en las que la semántica de los valores tiene sentido). Eche un vistazo a esta pregunta para una implementación común. Si anula Igualar código hash es igual. Usar un GUID es una idea bastante terrible porque quiere dos objetos que son instancias diferentes pero tienen el mismo valor para tener el mismo código hash y para que los iguales sean verdaderos.
Si usas el reafilamiento, puedes generar los cuerpos GetHashCode (), Equals y operator method para ti.
Acceda a este menú presionando Alt + Insertar .
http://www.jetbrains.com/resharper/webhelp/Code_Generation__Equality_Members.html
solo tiene que anular GetHashCode si está anulando Equals. El tiempo de ejecución implementa el GetHashCode predeterminado de forma similar a como lo quería hacer: cada objeto tiene un campo oculto asignado por el tiempo de ejecución.
En realidad, su IDE debería hacer esto por usted: cuando escribe "anular GetHashCode", el IDE debe generar este código repetitivo. Visual Studio no lo hace, pero SharpDevelop sí lo hace.