Metode System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Metode ini RuntimeHelpers.GetHashCode selalu memanggil Object.GetHashCode metode secara non-virtual, bahkan jika jenis objek telah menimpa Object.GetHashCode metode . Oleh karena itu, penggunaan RuntimeHelpers.GetHashCode mungkin berbeda dari panggilan GetHashCode
langsung pada objek dengan Object.GetHashCode metode .
Peringatan
RuntimeHelpers.GetHashCode Meskipun metode mengembalikan kode hash yang identik untuk referensi objek yang identik, Anda tidak boleh menggunakan metode ini untuk menguji identitas objek, karena kode hash ini tidak mengidentifikasi referensi objek secara unik. Untuk menguji identitas objek (yaitu, untuk menguji bahwa dua objek mereferensikan objek yang sama dalam memori), panggil Object.ReferenceEquals metode . Anda juga tidak boleh menggunakan GetHashCode untuk menguji apakah dua string mewakili referensi objek yang sama, karena string diinternasi. Untuk menguji interning string, panggil String.IsInterned metode .
Metode Object.GetHashCode dan RuntimeHelpers.GetHashCode berbeda sebagai berikut:
- Object.GetHashCode mengembalikan kode hash yang didasarkan pada definisi kesetaraan objek. Misalnya, dua string dengan konten yang identik akan mengembalikan nilai yang sama untuk Object.GetHashCode.
- RuntimeHelpers.GetHashCode mengembalikan kode hash yang menunjukkan identitas objek. Artinya, dua variabel string yang kontennya identik dan mewakili string yang diinternasi (lihat bagian String Interning ) atau yang mewakili string tunggal dalam kode hash identik pengembalian memori.
Penting
Perhatikan bahwa GetHashCode selalu mengembalikan kode hash yang identik untuk referensi objek yang sama. Namun, kebalikannya tidak benar: kode hash yang sama tidak menunjukkan referensi objek yang sama. Nilai kode hash tertentu tidak unik untuk referensi objek tertentu; referensi objek yang berbeda dapat menghasilkan kode hash yang identik.
Metode ini digunakan oleh pengkompilasi.
Interning string
Runtime bahasa umum (CLR) mempertahankan kumpulan string internal dan menyimpan literal di kumpulan. Jika dua string (misalnya, str1
dan str2
) terbentuk dari string yang identik harfiah, CLR akan mengatur str1
dan str2
untuk menunjuk ke lokasi yang sama pada tumpukan terkelola untuk menghemat memori. Memanggil RuntimeHelpers.GetHashCode dua objek string ini akan menghasilkan kode hash yang sama, bertentangan dengan item berpoin kedua di bagian sebelumnya.
CLR hanya menambahkan literal ke kumpulan. Hasil operasi string seperti perangkaian tidak ditambahkan ke kumpulan, kecuali kompiler menyelesaikan perangkaian string sebagai string tunggal literal. Oleh karena itu, jika str2
dibuat sebagai hasil dari operasi perangkaian, dan str2
identik dengan str1
, menggunakan RuntimeHelpers.GetHashCode pada dua objek string ini tidak akan menghasilkan kode hash yang sama.
Jika Anda ingin menambahkan string yang digabungkan ke kumpulan secara eksplisit, gunakan metode .String.Intern
Anda juga dapat menggunakan String.IsInterned metode untuk memeriksa apakah string memiliki referensi magang.
Contoh
Contoh berikut menunjukkan perbedaan antara Object.GetHashCode metode dan RuntimeHelpers.GetHashCode . Output dari contoh mengilustrasikan hal berikut:
Kedua set kode hash untuk serangkaian string pertama yang diteruskan ke
ShowHashCodes
metode berbeda, karena stringnya benar-benar berbeda.Object.GetHashCode menghasilkan kode hash yang sama untuk kumpulan string kedua yang diteruskan ke
ShowHashCodes
metode , karena string sama. Namun, metode ini RuntimeHelpers.GetHashCode tidak. String pertama didefinisikan dengan menggunakan string harfiah dan sebagainya diinternasi. Meskipun nilai string kedua sama, string tersebut tidak diinternasi, karena dikembalikan oleh panggilan ke String.Format metode .Dalam kasus string ketiga, kode hash yang diproduksi oleh Object.GetHashCode untuk kedua string identik, seperti halnya kode hash yang diproduksi oleh RuntimeHelpers.GetHashCode. Ini karena pengkompilasi telah memperlakukan nilai yang ditetapkan ke kedua string sebagai string tunggal literal, sehingga variabel string merujuk ke string magang yang sama.
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk