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.
| Özellik | Değer |
|---|---|
| Kural Kimliği | CA2218 |
| Başlık | "GetHashCode'u, Equals'i geçersiz kılarken geçersiz kılın" |
| Kategori | Kullanım |
| Düzeltme bozucu veya bozucu olmayan bir etkisi olabilir | Kaydırmaz |
| .NET 10'da varsayılan olarak etkin | Öneri olarak |
| Geçerli diller | Visual Basic |
Neden
Bir ortak tür System.Object.Equals geçersiz kılar ancak System.Object.GetHashCode geçersiz kılmaz.
Kural açıklaması
GetHashCode , karma algoritmalar ve karma tablolar gibi veri yapıları için uygun olan geçerli örneğe göre bir değer döndürür. Aynı türde ve eşit olan iki nesne, aşağıdaki türlerin örneklerinin düzgün çalıştığından emin olmak için aynı karma kodu döndürmelidir:
- System.Collections.Hashtable
- System.Collections.SortedList
- System.Collections.Generic.Dictionary<TKey,TValue>
- System.Collections.Generic.SortedDictionary<TKey,TValue>
- System.Collections.Generic.SortedList<TKey,TValue>
- System.Collections.Specialized.HybridDictionary
- System.Collections.Specialized.ListDictionary
- System.Collections.Specialized.OrderedDictionary
- Uygulayan türler System.Collections.Generic.IEqualityComparer<T>
Not
Bu kural yalnızca Visual Basic kodu için geçerlidir. C# derleyicisi ayrı bir uyarı (CS0659) oluşturur.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için GetHashCode uyarlamasını gerçekleştirin. Aynı türde iki nesne çifti için, eğer uygulamanız çift için Equals döndürürse, uygulamanızın aynı değeri döndürdüğünden emin olun.
Uyarıların ne zaman bastırılması gerekiyor?
Bu kuralın uyarısını bastırmayın.
Sınıf örneği
Aşağıdaki örnekte bu kuralı ihlal eden bir sınıf (başvuru türü) gösterilmektedir.
' This class violates the rule.
Public Class Point
Public Property X As Integer
Public Property Y As Integer
Public Sub New(x As Integer, y As Integer)
Me.X = x
Me.Y = y
End Sub
Public Overrides Function Equals(obj As Object) As Boolean
If obj = Nothing Then
Return False
End If
If [GetType]() <> obj.GetType() Then
Return False
End If
Dim pt As Point = CType(obj, Point)
Return X = pt.X AndAlso Y = pt.Y
End Function
End Class
Aşağıdaki örnek, GetHashCode()'yi aşarak ihlali düzeltir.
' This class satisfies the rule.
Public Class Point
Public Property X As Integer
Public Property Y As Integer
Public Sub New(x As Integer, y As Integer)
Me.X = x
Me.Y = y
End Sub
Public Overrides Function GetHashCode() As Integer
Return X Or Y
End Function
Public Overrides Function Equals(obj As Object) As Boolean
If obj = Nothing Then
Return False
End If
If [GetType]() <> obj.GetType() Then
Return False
End If
Dim pt As Point = CType(obj, Point)
Return Equals(pt)
End Function
Public Overloads Function Equals(pt As Point) As Boolean
Return X = pt.X AndAlso Y = pt.Y
End Function
Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
Return pt1.Equals(pt2)
End Operator
Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
Return Not pt1.Equals(pt2)
End Operator
End Class
İlgili kurallar
- CA1046: Eşitlik işleçlerini başvuru türlerinde aşırı yüklemeyin
- CA2224: 'Equals' operatörünü aşırı yüklerken 'equals' metodunu geçersiz kılın
- CA2225: Operatör aşırı yüklemelerinin adlandırılmış alternatifleri vardır
- CA2226: Operatörler simetrik aşırı yüklemelere sahip olmalıdır
- CA2231: ValueType.Equals yöntemi geçersiz kılındığında eşittir işlecini aşırı yükle