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

Dekont

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 Equalstrue 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

Ayrıca bkz.