Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Die RuntimeHelpers.GetHashCode Methode ruft die Object.GetHashCode Methode immer nicht virtuell auf, auch wenn der Typ des Objekts die Object.GetHashCode Methode überschrieben hat. Daher kann sich die Verwendung RuntimeHelpers.GetHashCode von dem direkten Aufrufen GetHashCode des Objekts mit der Object.GetHashCode Methode unterscheiden.
Warnung
Obwohl die RuntimeHelpers.GetHashCode Methode identische Hashcodes für identische Objektverweise zurückgibt, sollten Sie diese Methode nicht zum Testen der Objektidentität verwenden, da dieser Hashcode keinen Objektverweis eindeutig identifiziert. Rufen Sie zum Testen der Objektidentität (d. h. zum Testen, dass zwei Objekte auf dasselbe Objekt im Arbeitsspeicher verweisen) die Object.ReferenceEquals Methode auf. Sie sollten GetHashCode auch nicht verwenden, um zu testen, ob zwei Zeichenfolgen auf denselben Objektverweis zeigen, da sie möglicherweise intern gespeichert sind. Rufen Sie die String.IsInterned Methode auf, um die Zeichenfolgen-Internierung zu testen.
Die Object.GetHashCode Methoden und RuntimeHelpers.GetHashCode Methoden unterscheiden sich wie folgt:
- Object.GetHashCode gibt einen Hashcode zurück, der auf der Definition der Gleichheit des Objekts basiert. Beispielsweise geben zwei Zeichenfolgen mit identischen Inhalten denselben Wert für Object.GetHashCode.
- RuntimeHelpers.GetHashCode gibt einen Hashcode zurück, der die Objektidentität angibt. Das heißt, zwei Zeichenfolgenvariablen, deren Inhalt identisch sind und eine internierte Zeichenfolge darstellen (siehe Abschnitt " Zeichenfolge interning ") oder die eine einzelne Zeichenfolge im Speicher darstellen, geben identische Hashcodes zurück.
Von Bedeutung
Beachten Sie, dass GetHashCode immer identische Hashcodes für gleiche Objektverweise zurückgegeben werden. Die Umgekehrte ist jedoch nicht wahr: Gleiche Hashcodes geben keine gleichen Objektverweise an. Ein bestimmter Hashcodewert ist für einen bestimmten Objektverweis nicht eindeutig; unterschiedliche Objektverweise können identische Hashcodes generieren.
Diese Methode wird von Compilern verwendet.
Zeichenfolgen-Internierung
Die Common Language Runtime (CLR) verwaltet einen internen Pool von Zeichenfolgen und speichert Literale im Pool. Wenn zwei Zeichenfolgen (z. B. str1 und str2) aus einem identischen Zeichenfolgenliteral gebildet werden, setzt die CLR str1 und str2 so, dass sie auf dieselbe Position im verwalteten Heap zeigen, um Arbeitsspeicher zu sparen. Das Aufrufen von RuntimeHelpers.GetHashCode auf diese beiden Zeichenfolgenobjekte erzeugt denselben Hash-Code, im Gegensatz zum zweiten Aufzählungspunkt im vorherigen Abschnitt.
Der CLR fügt dem Pool nur Literale hinzu. Ergebnisse von Zeichenfolgenoperationen wie die Verkettung werden dem Pool nicht hinzugefügt, es sei denn, der Compiler löst die Zeichenfolgenverkettung als ein einzelnes Zeichenfolgenliteral auf. Wenn str2 daher das Ergebnis eines Verkettungsvorgangs ist und str2 mit str1 identisch ist, wird die Verwendung von RuntimeHelpers.GetHashCode auf diesen beiden Zeichenfolgenobjekten unterschiedliche Hashcodes erzeugen.
Wenn Sie dem Pool explizit eine verkettete Zeichenfolge hinzufügen möchten, verwenden Sie die String.Intern Methode.
Sie können die String.IsInterned Methode auch verwenden, um zu überprüfen, ob eine Zeichenfolge über einen internen Verweis verfügt.
Beispiele
Im folgenden Beispiel wird der Unterschied zwischen den Object.GetHashCode- und RuntimeHelpers.GetHashCode-Methoden veranschaulicht. Die Ausgabe aus dem Beispiel veranschaulicht Folgendes:
Beide Sätze von Hashcodes für den ersten Satz von Zeichenfolgen, die an die
ShowHashCodesMethode übergeben werden, unterscheiden sich, da die Zeichenfolgen vollständig unterschiedlich sind.Object.GetHashCode generiert denselben Hashcode für den zweiten Satz von Zeichenfolgen, die an die
ShowHashCodesMethode übergeben werden, da die Zeichenfolgen gleich sind. Jedoch tut dies die RuntimeHelpers.GetHashCode-Methode nicht. Die erste Zeichenfolge wird mithilfe eines Zeichenfolgenliterals definiert und wird daher interniert. Obwohl der Wert der zweiten Zeichenfolge identisch ist, ist sie nicht interniert, da sie von einem Aufruf der String.Format-Methode zurückgegeben wird.Im Falle der dritten Zeichenfolge sind die von Object.GetHashCode für beide Zeichenfolgen erzeugten Hashcodes identisch, ebenso wie die Hashcodes, die von RuntimeHelpers.GetHashCode erzeugt werden. Dies liegt daran, dass der Compiler den beiden Zeichenfolgen denselben Wert zugewiesen hat und diesen als ein einziges Zeichenfolgenliteral behandelt. Daher verweisen die Zeichenfolgenvariablen auf dieselbe internierte Zeichenfolge.
using System;
using System.Runtime.CompilerServices;
public class Example
{
public static void Main()
{
Console.WriteLine("{0,-18} {1,6} {2,18:N0} {3,6} {4,18:N0}\n",
"", "Var 1", "Hash Code", "Var 2", "Hash Code");
// Get hash codes of two different strings.
String sc1 = "String #1";
String sc2 = "String #2";
ShowHashCodes("sc1", sc1, "sc2", sc2);
// Get hash codes of two identical non-interned strings.
String s1 = "This string";
String s2 = String.Format("{0} {1}", "This", "string");
ShowHashCodes("s1", s1, "s2", s2);
// Get hash codes of two (evidently concatenated) strings.
String si1 = "This is a string!";
String si2 = "This " + "is " + "a " + "string!";
ShowHashCodes("si1", si1, "si2", si2);
}
private static void ShowHashCodes(String var1, Object value1,
String var2, Object value2)
{
Console.WriteLine("{0,-18} {1,6} {2,18:X8} {3,6} {4,18:X8}",
"Obj.GetHashCode", var1, value1.GetHashCode(),
var2, value2.GetHashCode());
Console.WriteLine("{0,-18} {1,6} {2,18:X8} {3,6} {4,18:X8}\n",
"RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
var2, RuntimeHelpers.GetHashCode(value2));
}
}
// The example displays output similar to the following:
// Var 1 Hash Code Var 2 Hash Code
//
// Obj.GetHashCode sc1 94EABD27 sc2 94EABD24
// RTH.GetHashCode sc1 02BF8098 sc2 00BB8560
//
// Obj.GetHashCode s1 29C5A397 s2 29C5A397
// RTH.GetHashCode s1 0297B065 s2 03553390
//
// Obj.GetHashCode si1 941BCEA5 si2 941BCEA5
// RTH.GetHashCode si1 01FED012 si2 01FED012
Imports System.Runtime.CompilerServices
Module Example
Public Sub Main()
Console.WriteLine("{0,-18} {1,6} {2,18:N0} {3,6} {4,18:N0}",
"", "Var 1", "Hash Code", "Var 2", "Hash Code")
Console.WriteLine()
' Get hash codes of two different strings.
Dim sc1 As String = "String #1"
Dim sc2 As String = "String #2"
ShowHashCodes("sc1", sc1, "sc2", sc2)
' Get hash codes of two identical non-interned strings.
Dim s1 As String = "This string"
Dim s2 As String = String.Format("{0} {1}", "This", "string")
ShowHashCodes("s1", s1, "s2", s2)
' Get hash codes of two (evidently concatenated) strings.
Dim si1 As String = "This is a string!"
Dim si2 As String = "This " + "is " + "a " + "string!"
ShowHashCodes("si1", si1, "si2", si2)
End Sub
Private Sub ShowHashCodes(var1 As String, value1 As Object,
var2 As String, value2 As Object)
Console.WriteLine("{0,-18} {1,6} {2,18:X8} {3,6} {4,18:X8}",
"Obj.GetHashCode", var1, value1.GetHashCode,
var2, value2.GetHashCode)
Console.WriteLine("{0,-18} {1,6} {2,18:X8} {3,6} {4,18:X8}",
"RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
var2, RuntimeHelpers.GetHashCode(value2))
Console.WriteLine()
End Sub
End Module
' The example displays output similar to the following:
' Var 1 Hash Code Var 2 Hash Code
'
' Obj.GetHashCode sc1 94EABD27 sc2 94EABD24
' RTH.GetHashCode sc1 02BF8098 sc2 00BB8560
'
' Obj.GetHashCode s1 29C5A397 s2 29C5A397
' RTH.GetHashCode s1 0297B065 s2 03553390
'
' Obj.GetHashCode si1 941BCEA5 si2 941BCEA5
' RTH.GetHashCode si1 01FED012 si2 01FED012