Pregunta

Estoy trabajando en escribir un compilador para un lenguaje ejecuta en .NET y una de las cosas que me gustaría que haga es generar automáticamente el método GetHashCode, pero tengo varias preguntas:

  • ¿Es esto posible, hace que el compilador sabe lo suficiente sobre el tipo (s) involucrados para hacer un trabajo razonable la realización del procedimiento?
  • ¿Debo hacer esto para los tipos de valores, tipos de referencia, o ambos?
  • ¿Qué es un algoritmo de GetHashCode razonable para el compilador para generar el cual incluye soporte para propiedades nulos y así sucesivamente?
  • se ha hecho esto en otro idioma / compilador que puedo mirar?
  • Si esto no es posible o es una muy mala idea, ¿por qué?

Gracias

¿Fue útil?

Solución

Tener un vistazo a lo que hace el compilador de C # para los tipos anónimos. Básicamente se trata de la misma especie de almohadilla, como me gustaría escribir mi mismo:

public override int GetHashCode()
{
    int hash = 17;
    hash = 31 * hash + field1.GetHashCode();
    hash = 31 * hash + field2.GetHashCode();
    // etc
    return hash;
}

(Es necesario un poco de nulidad comprobar también, por supuesto.)

Creo que es una buena idea hacer esto (y anulación de la igualdad) para los tipos inmutables, pero por lo general no para los tipos mutables. Los tipos de valor casi siempre deben ser inmutables de todos modos - tipos de referencia pueden ir en cualquier dirección. ¿Su lenguaje tiene incorporada en la noción de la inmutabilidad? Por supuesto, esto va a salir mal si su tipo es "inmutable superficial", pero contiene tipos mutables, que GetHashCode anulación para indicar la actuales estado del objeto. Tales tipos serían generalmente dolorosa de todas formas.

En aunque en general, creo que es razonable en muchos casos a los códigos de igualdad y croquetas de Autogenerar - de hecho, me gustaría que esto sea parte de C # 5 para tipos con nombre demasiado: quiero una manera fácil de nombrando tipos que de otro modo tiene las mismas características que los tipos anónimos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top