Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.
RuntimeHelpers.GetHashCode yöntemi, nesnenin türü Object.GetHashCode yöntemini geçersiz kılsa bile, Object.GetHashCode yöntemini her zaman sanal olarak değil çağırır. Bu nedenle, RuntimeHelpers.GetHashCode yöntemini kullanma ile GetHashCode doğrudan nesne üzerinde Object.GetHashCode çağrılması farklı olabilir.
Uyarı
yöntemi özdeş RuntimeHelpers.GetHashCode nesne başvuruları için aynı karma kodları döndürse de, bu karma kodu bir nesne başvuruyu benzersiz olarak tanımlamadığından, nesne kimliğini test etmek için bu yöntemi kullanmamalısınız. Nesne kimliğini test etmek için (yani iki nesnenin bellekte aynı nesneye başvurduğunu test etmek için) yöntemini çağırın Object.ReferenceEquals . Ayrıca dizeler içe aktarıldığı için iki dize eşit nesne referanslarını temsil edip etmediğini test etmek amacıyla GetHashCode kullanmamalısınız. Dize birleştirmeyi test etmek için String.IsInterned yöntemini çağırın.
Object.GetHashCode ve RuntimeHelpers.GetHashCode yöntemleri aşağıdaki gibi farklılık gösterir:
- Object.GetHashCode , nesnenin eşitlik tanımını temel alan bir karma kod döndürür. Örneğin, içeriği aynı olan iki dize için Object.GetHashCodeaynı değeri döndürür.
- RuntimeHelpers.GetHashCode nesne kimliğini gösteren bir karma kod döndürür. Başka bir ifadeyle, içeriği aynı olan ve intern edilen bir dizeyi temsil eden ( Dize İnternasyonu bölümüne bakın) veya bellekteki tek bir dizeyi temsil eden iki dize değişkeni aynı karma kodları döndürür.
Önemli
GetHashCode her zaman eşit nesne başvuruları için aynı karma kodları döndürür, bunu unutmayın. Ancak, tersi doğru değildir: eşit karma kodları eşit nesne referanslarını göstermez. Belirli bir karma kod değeri belirli bir nesne başvurusu için benzersiz değildir; farklı nesne başvuruları aynı karma kodları oluşturabilir.
Bu yöntem derleyiciler tarafından kullanılır.
Dize stajyeri
Ortak dil çalışma zamanı (CLR), bir iç dize havuzu tutar ve değişmez değerleri havuzda depolar. İki dize (örneğin, str1 ve str2) özdeş bir dize değişmez değerden oluşturulmuşsa, CLR, belleği korumak için str1 ve str2 yönetilen yığında aynı konuma işaret edecek şekilde ayarlar. Bu iki dize nesnesinin çağrılması RuntimeHelpers.GetHashCode , önceki bölümdeki ikinci madde işaretli öğenin aksine aynı karma kodu üretir.
CLR yalnızca sabitleri havuza ekler. Derleyici dize birleştirmeyi tek bir dize sabiti olarak çözümlemediği sürece, birleştirme gibi dize işlemlerinin sonuçları havuza eklenmez. Bu nedenle, eğer str2 birleştirme işleminin sonucu olarak oluşturulduysa ve str2str1 ile aynıysa, bu iki dize nesnesi üzerinde RuntimeHelpers.GetHashCode kullanılması aynı karma kodunu üretmeyecektir.
Havuza açıkça birleştirilmiş bir dize eklemek istiyorsanız yöntemini kullanın String.Intern .
Bir dizenin interned bir referansı olup olmadığını kontrol etmek için String.IsInterned yöntemini kullanabilirsiniz.
Örnekler
Aşağıdaki örnek, Object.GetHashCode ve RuntimeHelpers.GetHashCode yöntemleri arasındaki farkı göstermektedir. Örnekten elde edilen çıkışta aşağıdakiler gösterilmektedir:
Yöntemine geçirilen
ShowHashCodesilk dize kümesi için her iki karma kod kümesi de farklıdır, çünkü dizeler tamamen farklıdır.Object.GetHashCode , yönteme geçirilen
ShowHashCodesikinci dize kümesi için aynı karma kodu oluşturur çünkü dizeler eşittir. Ancak, RuntimeHelpers.GetHashCode yöntemi bunu gerçekleştirmez. İlk dize bir dize sabiti kullanılarak tanımlanır ve bu nedenle kümelenir. İkinci dizenin değeri aynı olsa da, String.Format yöntemine yapılan bir çağrı tarafından döndürüldüğü için interned değildir.Üçüncü dize söz konusu olduğunda, Object.GetHashCode tarafından her iki dize için üretilen karma kodları ile RuntimeHelpers.GetHashCode tarafından üretilen karma kodları aynıdır. Bunun nedeni, derleyicinin her iki dizeye de atanan değeri tek bir dize değişmez değeri olarak ele almış olması ve dolayısıyla dize değişkenlerinin aynı dizeye başvurmasıdır.
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