Se si dispone di un'enumerazione memorizzata all'interno di un tipo di aggregazione, è possibile includerla all'interno del codice hash del tipo (presupponendo una tipica funzione di hash "multiply by primes"). Se si chiama semplicemente SomeEnum.GetHashCode()
, sembra che il JIT inscatoli l'istanza, anche nelle versioni di rilascio.Come si recupera il codice hash di un'enumerazione senza inserirlo?
Il profilo mostra circa il 10% del tempo trascorso dalla mia applicazione in enumerazioni di boxe all'interno di varie funzioni GetHashCode
.
Diversi tipi di valore implementano IEquatable
o interfacce simili, che consente di chiamare GetHashCode
come metodo statico; che evita il pugilato. Ma System.Enum
non fornisce l'overload statico di GetHashCode
. C'è qualche mezzo per calcolare il codice che dovrebbe essere usato ma che evita il pugilato?
Perché preoccuparsi del tutto? L'enum è il proprio codice hash. Basta trasmettere a int e chiamarlo un giorno. –
@ Raymond: ho pensato che potrebbe causare una cattiva distribuzione; ma ripensandoci, vedrò se funziona. –
@ Raymond: Questo funziona davvero per questo particolare caso di test. L'ho lasciato aperto per un po '... –