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 9'da 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.
Not
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 none
olarak 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
İlgili kurallar
- CA1046: Başvuru türlerinde eşittir işleçlerini aşırı yüklemeyin
- CA2218: GetHashCode'u Eşittir'i geçersiz kılarak geçersiz kılın
- CA2225: İşleç aşırı yüklemeleri adlandırılmış alternatiflere sahiptir
- CA2226: İşleçler simetrik aşırı yüklemelere sahip olmalıdır
- CA2231: ValueType.Equals değerini geçersiz kılmada eşittir işlecini aşırı yükle