CA2218: GetHashCode'u Eşittir'i geçersiz kılarak geçersiz kılın
Özellik | Değer |
---|---|
Kural Kimliği | CA2218 |
Başlık | GetHashCode'u Eşittir'i geçersiz kılarak geçersiz kılın |
Kategori | Kullanım |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Öneri olarak |
Neden
Ortak tür geçersiz kılar System.Object.Equals ancak geçersiz kılmaz System.Object.GetHashCode.
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 uygulamasını GetHashCodesağlayın. Aynı türde bir nesne çifti için, uygulamanız çift için döndürürse uygulamanın aynı değeri döndürdüğünden Equals true
emin olun.
Uyarıların ne zaman bastırılması gerekiyor?
Bu kuraldan uyarıyı 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, geçersiz kılarak ihlali düzeltir GetHashCode().
' 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: Başvuru türlerinde eşittir işleçlerini aşırı yüklemeyin
- CA2224: Eşittir işlecini aşırı yükleyerek eşittiri geçersiz kılın
- CA2225: İşleç aşırı yüklemeleri adlandırılmış alternatiflere sahiptir
- CA2226: İşleçler simetrik aşırı yüklemelere sahip olmalıdır
- CA2231: ValueType.Equals değerini geçersiz kılmada eşittir işlecini aşırı yükle