Bagikan melalui


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 8 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:

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

Baca juga