System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode yöntemi

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

nesnenin RuntimeHelpers.GetHashCodeObject.GetHashCode türü yöntemi geçersiz kılsa Object.GetHashCode bile yöntemi her zaman sanal olmayan olarak çağırır. Bu nedenle, kullanma RuntimeHelpers.GetHashCode yöntemiyle Object.GetHashCode doğrudan nesne üzerinde çağrılmasından GetHashCode 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 . Dizenin iç içe geçmiş olması nedeniyle, iki dizenin eşit nesne başvurularını temsil edip etmediğini test etmek için de kullanmanız GetHashCode gerekir. Dize stajyerini test etmek için yöntemini çağırın String.IsInterned .

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 iç içe geçmiş bir dizeyi temsil eden (Dize Stajyeri 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

Eşit nesne başvuruları için her zaman aynı karma kodları döndürdüğünü GetHashCode unutmayın. Ancak, tersi doğru değildir: eşit karma kodları eşit nesne başvuruları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 biçimlendirilmişse, CLR belleği korumak için yönetilen yığında aynı konuma işaret edecek şekilde ayarlanırstr1.str2 Bu iki dize nesnesinin çağrılması RuntimeHelpers.GetHashCode , önceki bölümdeki ikinci madde işaretli öğenin aksine aynı karma kodu üretir.

CLR havuza yalnızca değişmez değerler ekler. Derleyici dize birleştirmeyi tek bir dize değişmez değeri olarak çözümlemediği sürece birleştirme gibi dize işlemlerinin sonuçları havuza eklenmez. Bu nedenle, birleştirme işleminin sonucu olarak oluşturulduysa ve str2 ile aynıysa str2str1, bu iki dize nesnesinin kullanılması RuntimeHelpers.GetHashCode aynı karma kodu üretmez.

Havuza açıkça birleştirilmiş bir dize eklemek istiyorsanız yöntemini kullanın String.Intern .

Bir dizenin String.IsInterned bir interned başvurusu olup olmadığını denetlemek için yöntemini de kullanabilirsiniz.

Örnekler

Aşağıdaki örnekte ve RuntimeHelpers.GetHashCode yöntemleri arasındaki Object.GetHashCode fark gösterilmektedir. Örnekten elde edilen çıkışta aşağıdakiler gösterilmektedir:

  • Yöntemine geçirilen ShowHashCodes ilk 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 ShowHashCodes ikinci dize kümesi için aynı karma kodu oluşturur çünkü dizeler eşittir. Ancak yöntemi RuntimeHelpers.GetHashCode bunu yapmaz. İlk dize bir dize değişmez değeri kullanılarak tanımlanır ve bu nedenle interned. İkinci dizenin değeri aynı olsa da, yöntemine yapılan bir çağrı String.Format tarafından döndürülür çünkü bu dizenin interned değildir.

  • Üçüncü dize söz konusu olduğunda, tarafından Object.GetHashCode her iki dize için üretilen karma kodları da tarafından RuntimeHelpers.GetHashCodeüretilen karma kodlar gibi 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