Wenn eine Aufzählung in einem Aggregat-Typ gespeichert ist, möchte man diese möglicherweise in den Hash-Code des Typs einschließen (unter der Annahme eines typischen " multiplizieren mit Primzahlen "Hash-Funktion". Wenn man nur SomeEnum.GetHashCode()
aufruft, scheint das JIT die Instanz selbst in Release-Builds zu boxen.
Das Profiling zeigt, dass etwa 10% der Zeit meiner Anwendung mit dem Auffüllen von Aufzählungen in verschiedenen GetHashCode
-Funktionen verbracht hat.
Mehrere Werttypen implementieren IEquatable
oder ähnliche Schnittstellen, wodurch GetHashCode
als statische Methode aufgerufen werden kann. was das Boxen vermeidet. Aber System.Enum
bietet keine statische Überladung von GetHashCode
. Gibt es einige Mittel, um den Code zu berechnen, der verwendet werden sollte, aber das Boxen vermeidet?
Sie können in den zugrunde liegenden Typ der Enumeration umwandeln (normalerweise int
, sofern die Definition der Enumeration nichts anderes angibt) und die überschriebene GetHashCode()
-Methode des Typs verwenden.
Hier ist die IL für diesen Code:
%Vor% Bearbeiten: Der Vollständigkeit halber sollte ich darauf hinweisen, dass der Körper von int.GetHashCode()
einfach return this;
ist, also, wie Raymond Chen in einem Kommentar oben darauf hingewiesen hat, einfach die Enumeration in int
ist gut genug, um einen Hash-Code zu erhalten.