RuntimeHelpers.GetHashCode(Object) Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Egy adott objektum kivonatfüggvényeként szolgál, és használható kivonatkódokat használó algoritmusokban és adatstruktúrákban, például kivonattáblákban.
public:
static int GetHashCode(System::Object ^ o);
public static int GetHashCode(object o);
public static int GetHashCode(object? o);
static member GetHashCode : obj -> int
Public Shared Function GetHashCode (o As Object) As Integer
Paraméterek
- o
- Object
Egy objektum, amely lekéri a kivonat kódját.
Válaszok
A paraméter által azonosított objektum kivonatkódja o .
Példák
Az alábbi példa bemutatja a különbséget a Object.GetHashCode és a RuntimeHelpers.GetHashCode módszerek között. A példa kimenete a következőket szemlélteti:
A
ShowHashCodesmetódusnak átadott első karakterláncok mindkét hash kód készlete eltérő, mert a karakterláncok teljesen különbözőek.Object.GetHashCode Ugyanazt a kivonatkódot hozza létre a metódusnak
ShowHashCodesátadott második sztringkészlethez, mivel a sztringek egyenlők. Azonban a RuntimeHelpers.GetHashCode módszer nem. Az első karakterlánc karakterlánc-literál használatával van definiálva, és így tárolásra kerül. Bár a második sztring értéke megegyezik, nem internálódik, mert a metódus hívása String.Format adja vissza.A harmadik sztring esetében a két sztring által Object.GetHashCode előállított kivonatkódok azonosak, ahogyan a RuntimeHelpers.GetHashCode. Ennek az az oka, hogy a fordító egyetlen sztringkonstansként kezelte a két sztringhez rendelt értéket, így a sztringváltozók ugyanarra az internált sztringre hivatkoznak.
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
Megjegyzések
A RuntimeHelpers.GetHashCode metódus mindig nem virtuálisan hívja meg a Object.GetHashCode metódust, még akkor is, ha az objektum típusa felülírta a metódust Object.GetHashCode . Ezért RuntimeHelpers.GetHashCode használata eltérhet attól, hogy a GetHashCode metódussal közvetlenül az objektumon hívja meg Object.GetHashCode.
Warning
Bár a RuntimeHelpers.GetHashCode metódus azonos objektumhivatkozások azonos kivonatkódjait adja vissza, ezt a módszert nem érdemes az objektumdentitás tesztelésére használni, mert ez a kivonatkód nem azonosít egyedileg objektumhivatkozásokat. Az objektumdentitás teszteléséhez (vagyis annak ellenőrzéséhez, hogy két objektum ugyanarra az objektumra hivatkozik-e a memóriában), hívja meg a metódust Object.ReferenceEquals . Azt sem érdemes tesztelni, GetHashCode hogy két sztring egyenlő objektumhivatkozásokat jelöl-e, mert a sztring internálva van. A sztring-értékek internálásának teszteléséhez használja a(z) String.IsInterned metódust.
A Object.GetHashCode és a RuntimeHelpers.GetHashCode módszer a következőkben különbözik:
- Object.GetHashCode egy kivonatkódot ad vissza, amely az objektum egyenlőségi definícióján alapul. Két azonos tartalmú sztring például ugyanazt az értéket Object.GetHashCodeadja vissza.
- RuntimeHelpers.GetHashCode egy objektumdentitást jelző kivonatkódot ad vissza. Ez azt jelenti, hogy két sztringváltozó, amelyek tartalma megegyezik, és egy internált sztringet jelöl (lásd a Karakterláncközi szakaszt), vagy amelyek egyetlen sztringet jelölnek a memóriában, azonos kivonatkódokat adnak vissza.
Important
Vegye figyelembe, hogy GetHashCode az azonos objektumhivatkozások esetében mindig azonos kivonatkódokat ad vissza. A fordított érték azonban nem igaz: az egyenlő kivonatkódok nem jelölnek egyenlő objektumhivatkozásokat. Egy adott kivonatkód értéke nem egyedi egy adott objektumhivatkozásban; a különböző objektumhivatkozások azonos kivonatkódokat hozhatnak létre.
Ezt a módszert a fordítók használják.
Sztringek közötti internálás
A közös nyelvi futtatókörnyezet (CLR) egy belső sztringhalmazt tart fenn, és a készletben tárolja a literálokat. Ha két karakterlánc (például str1 és str2) azonos sztringkonstansból jön létre, a CLR str1-t és str2-t ugyanarra a helyre irányítja a kezelt halmon, hogy memóriát takarítson meg. A RuntimeHelpers.GetHashCode hívása erre a két sztring objektumra ugyanazt a hash kódot fogja eredményezni, ellentétben az előző szakasz második listajeles elemével.
A CLR csak literálokat ad hozzá a készlethez. A sztringműveletek, például az összefűzés eredményei nem lesznek hozzáadva a készlethez, kivéve, ha a fordító egyetlen sztringkonstansként oldja fel a sztringösszefűzést. Ezért ha str2 egy összefűzési művelet eredményeként jött létre, és str2 megegyezik str1-vel, az a két sztringobjektum alkalmazásával RuntimeHelpers.GetHashCode, nem fogja ugyanazt a kivonatkódot létrehozni.
Ha egy összefűzött karakterláncot szeretne kifejezetten hozzáadni a készlethez, használja a String.Intern metódust.
A String.IsInterned metódust használva azt is ellenőrizheti, hogy egy karakterlánc rendelkezik-e internált hivatkozással.