moduloObjectHashcode MDA
Not
Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.
Yönetilen moduloObjectHashcode
hata ayıklama yardımcısı (MDA), yöntemi tarafından döndürülen karma kod üzerinde bir modül işlemi gerçekleştirmek için sınıfın GetHashCode davranışını Object değiştirir. Bu MDA için varsayılan modül 1'dir ve bu da tüm nesneler için 0 döndürmesine neden olur GetHashCode .
Belirtiler
Ortak dil çalışma zamanının (CLR) yeni bir sürümüne geçtikten sonra, bir program artık düzgün yürütülmemektedir:
Program bir Hashtableöğesinden yanlış nesne alıyor.
bir sabit listesi Hashtable sırası, programı bozan bir değişiklik içerir.
Eskiden eşit olan iki nesne artık eşit değildir.
Eskiden eşit olmayan iki nesne artık eşit.
Neden
Yöntemine çağrının GetHashCode sonuçlarını karşılaştırarak nesne eşitliği testlerine Hashtable anahtar için sınıfındaki yönteminin uygulanması Equals nedeniyle programınız bir öğesinden Hashtable yanlış nesne alıyor olabilir. karma kodları nesne eşitliğini test etmek için kullanılmamalıdır, çünkü iki nesnenin ilgili alanları farklı değerlere sahip olsa bile aynı karma koda sahip olabilir. Bu karma kod çakışmaları pratikte nadir olsa da gerçekleşir. Bunun bir Hashtable arama üzerindeki etkisi, eşit olmayan iki anahtarın eşit gibi görünmesi ve öğesinden Hashtableyanlış nesnenin döndürülmesidir. Performans nedenleriyle, uygulaması GetHashCode çalışma zamanı sürümleri arasında değişebilir, bu nedenle bir sürümde gerçekleşemeyen çakışmalar sonraki sürümlerde gerçekleşebilir. Karma kodlar çakıldığında kodunuzun hataları olup olmadığını test etmek için bu MDA'yı etkinleştirin. Etkinleştirildiğinde, bu MDA yönteminin GetHashCode 0 döndürmesine neden olur ve tüm karma kodların çakışmasına neden olur. Bu MDA'nın etkinleştirilmesinin programınız üzerindeki tek etkisi, programınızın daha yavaş çalışmasıdır.
Anahtar değişikliği için karma kodları hesaplamak için kullanılan algoritma çalışma zamanının bir sürümünden diğerine sabit listesi Hashtable sırası değişebilir. Programınızın karma tablodaki anahtarların veya değerlerin sabit listesi sırasına bağımlılık alıp almadığını test etmek için bu MDA'yı etkinleştirebilirsiniz.
Çözüm
Karma kodları hiçbir zaman nesne kimliği yerine kullanmayın. Karma kodları karşılaştırmamak için yöntemini geçersiz Object.Equals kılmayı uygulayın.
Karma tablolardaki anahtarların veya değerlerin sabit listesi sırasına göre bağımlılıklar oluşturmayın.
Çalışma Zamanı üzerindeki etkisi
Bu MDA etkinleştirildiğinde uygulamalar daha yavaş çalışır. Bu MDA yalnızca döndürülmüş olan karma kodu alır ve bunun yerine modüle bölündüğünde kalan kodu döndürür.
Çıktı
Bu MDA için çıkış yok.
Yapılandırma
özniteliği, modulus
karma kodda kullanılan modulus değerini belirtir. Varsayılan değer 1 şeklindedir.
<mdaConfig>
<assistants>
<moduloObjectHashcode modulus="1" />
</assistants>
</mdaConfig>