Wie holt man den Hash-Code einer Enumeration, ohne ihn einzupacken?

8

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?

    
Billy ONeal 28.12.2012, 01:04
quelle

1 Antwort

4

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.

%Vor%

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.

    
jam40jeff 28.12.2012, 01:23
quelle

Tags und Links