CA2224: Eşittir işlecini aşırı yüklemede Eşittir'i geçersiz kıl

Özellik Değer
Kural Kimliği CA2224
Başlık Eşittir işlecini aşırı yüklemede Eşittir'i geçersiz kıl
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, eşitlik işlecini uygular ancak geçersiz kılmaz System.Object.Equals.

Kural açıklaması

Eşitlik işleci, yönteminin işlevselliğine Equals erişmek için sağlam bir şekilde kullanışlı bir yol olarak tasarlanmıştır. Eşitlik işlecini uygularsanız, mantığı ile Equalsaynı olmalıdır.

Dekont

Bu kural yalnızca Visual Basic kodu için geçerlidir. C# derleyicisi ayrı bir uyarı (CS0660) oluşturur.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için, eşitlik işlecinin uygulamasını kaldırmanız veya geçersiz kılmanız Equals ve iki yöntemin aynı değerleri döndürmesini sağlamalısınız. Eşitlik işleci tutarsız davranışa neden olmazsa, temel sınıfta yöntemini çağıran Equals bir uygulamasını Equals sağlayarak ihlali düzeltebilirsiniz.

Uyarıların ne zaman bastırılması gerekiyor?

Eşitlik işleci devralınan uygulamasıyla aynı değeri döndürürse, bu kuraldan gelen bir uyarıyı bastırmak güvenlidir Equals. Bu makaledeki örnekler, bu kuraldan gelen bir uyarıyı güvenli bir şekilde gizleyebilen bir tür içerir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Örnek

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 GetHashCode() As Integer
        Return HashCode.Combine(X, Y)
    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        If pt1 Is Nothing OrElse pt2 Is Nothing Then
            Return False
        End If

        If pt1.GetType() <> pt2.GetType() Then
            Return False
        End If

        Return pt1.X = pt2.X AndAlso pt1.Y = pt2.Y
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        Return Not pt1 = pt2
    End Operator

End Class

Aşağıdaki örnek, geçersiz kılarak ihlali düzeltir System.Object.Equals.

' 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 HashCode.Combine(X, 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 X = pt.X AndAlso Y = pt.Y

    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        ' Object.Equals calls Point.Equals(Object).
        Return Object.Equals(pt1, pt2)
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        ' Object.Equals calls Point.Equals(Object).
        Return Not Object.Equals(pt1, pt2)
    End Operator

End Class

Ayrıca bkz.