CA2218: Equals metodunu geçersiz kıldığınızda GetHashCode metodunu da geçersiz kılın

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

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

Ayrıca bkz.