CA2218: Ganti GetHashCode dengan mengganti Sama Dengan
Properti | Nilai |
---|---|
ID Aturan | CA2218 |
Judul | Mengambil alih GetHashCode saat menimpa Equals |
Golongan | Penggunaan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | Sebagai saran |
Penyebab
Jenis publik mengganti System.Object.Equals tetapi tidak mengganti System.Object.GetHashCode.
Deskripsi aturan
GetHashCode mengembalikan nilai, berdasarkan instans saat ini, yang cocok untuk algoritma hash dan struktur data seperti tabel hash. Dua objek dengan jenis yang sama dan sama harus mengembalikan kode hash yang sama untuk memastikan bahwa instans dari jenis berikut berfungsi dengan benar:
- 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
- Jenis yang mengimplementasikan System.Collections.Generic.IEqualityComparer<T>
Catatan
Aturan ini hanya berlaku untuk kode Visual Basic. Pengkompilasi C# menghasilkan peringatan terpisah, CS0659.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, berikan implementasi .GetHashCode Untuk sepasang objek dengan jenis yang sama, pastikan bahwa implementasi mengembalikan nilai yang sama jika implementasi Equals pengembalian true
Anda untuk pasangan tersebut.
Kapan harus menekan peringatan
Jangan menyembunyikan peringatan dari aturan ini.
Contoh kelas
Contoh berikut menunjukkan kelas (jenis referensi) yang melanggar aturan ini.
' 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
Contoh berikut memperbaiki pelanggaran dengan mengesampingkan 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
Aturan terkait
- CA1046: Jangan membebani sama dengan operator dengan jenis referensi
- CA2224: Ganti sama dengan pada sama dengan operator overloading
- CA2225: Overload operator telah memberi nama alternatif
- CA2226: Operator harus memiliki overload simetris
- CA2231: Sama dengan operator overload dalam mengganti ValueType.Equals