Bagikan melalui


CA2224: Mengambil alih Sama dengan operator kelebihan beban sama dengan

Properti Nilai
ID Aturan CA2224
Judul Mengesampingkan Sama dengan operator kelebihan beban sama dengan
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Jenis publik menerapkan operator kesetaraan tetapi tidak mengganti System.Object.Equals.

Deskripsi aturan

Operator kesetaraan dimaksudkan untuk menjadi cara yang nyaman secara sintetis untuk mengakses fungsionalitas Equals metode. Jika Anda menerapkan operator kesetaraan, logikanya harus identik dengan Equals.

Catatan

Aturan ini hanya berlaku untuk kode Visual Basic. Pengkompilasi C# menghasilkan peringatan terpisah, CS0660.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, Anda harus menghapus implementasi operator kesetaraan, atau mengambil Equals alih dan meminta kedua metode mengembalikan nilai yang sama. Jika operator kesetaraan tidak memperkenalkan perilaku yang tidak konsisten, Anda dapat memperbaiki pelanggaran dengan memberikan implementasi Equals yang memanggil Equals metode di kelas dasar.

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini jika operator kesetaraan mengembalikan nilai yang sama dengan implementasi yang diwariskan dari Equals. Contoh dalam artikel ini mencakup jenis yang dapat dengan aman menekan peringatan dari aturan ini.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

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

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh

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

Contoh berikut memperbaiki pelanggaran dengan mengesampingkan 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

Baca juga