Jeśli jeden z wyliczeń jest przechowywany wewnątrz typu agregatu, można to uwzględnić w haszowaniu typu (przy założeniu typowej funkcji mieszania "multiply by primes"). Jeśli ktoś po prostu zadzwoni pod numer SomeEnum.GetHashCode()
, wydaje się, że JIT umieszcza instancję, nawet w kompilacjach wydań.W jaki sposób można uzyskać kod skrótu wyliczenia bez boksowania go?
Profilowanie pokazuje, że około 10% czasu w mojej aplikacji spędził wyliczenia boksu w różnych funkcjach GetHashCode
.
Kilka typów wartości implementuje IEquatable
lub podobnych interfejsów, co umożliwia wywoływanie GetHashCode
jako metody statycznej; co pozwala uniknąć boksowania. Ale System.Enum
nie zapewnia przeciążenia statycznego GetHashCode
. Czy istnieje jakiś sposób obliczania kodu, który powinien zostać użyty, ale który unika boksowania?
Po co w ogóle kłopotać? Enum to własny kod skrótu. Wystarczy rzucić na int i nazwać to dziennie. –
@Raymond: Pomyślałem, że może to doprowadzić do złej dystrybucji; ale zastanawiając się nad tym jeszcze raz, sprawdzę, czy to działa. –
@Raymond: To rzeczywiście działa w tym konkretnym przypadku testowym. Zostawiam to otwarte przez jakiś czas ... –