Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Özellik | Değer |
|---|---|
| Kural Kimliği | CA2224 |
| Başlık | Operator eşitleşmesini aşırı yüklerken Equals yöntemini geçersiz kıl. |
| Kategori | Kullanım |
| Düzeltme bozucu ya da bozmayan olabilir | Kesintisiz |
| .NET 10'da varsayılan olarak etkin | Öneri olarak |
| Geçerli diller | Visual Basic |
Neden
Genel bir tür, eşitlik işlecini uygular, ancak System.Object.Equals yöntemini geçersiz kılmaz.
Kural açıklaması
Eşitlik işleci, Equals yönteminin işlevselliğine sözdizimi açısından kullanışlı bir şekilde erişim sağlamak üzere tasarlanmıştır. Eşittir işlecini uygularsanız, mantığı Equals ile aynı 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, ya eşitlik işlecinin uygulamasını kaldırmalı ya da Equals’yi geçersiz kılmalı ve her iki yöntemin aynı değerleri döndürmesini sağlamalısınız. Eşitlik işleci tutarsız davranışa neden olmazsa, Equals'nın temel sınıftaki Equals yöntemini çağıran bir uygulamasını sağlayarak ihlali düzeltebilirsiniz.
Uyarıların ne zaman bastırılması gerekiyor?
Eşitlik işleci, devralınan Equals uygulamasıyla aynı değeri döndürüyorsa, bu kuraldan gelen bir uyarıyı engellemek güvenlidir. 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, System.Object.Equals'ü geçersiz kılarak 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 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şitlik işleçlerini aşırı yüklemeyin
- CA2218: Equals metodunu geçersiz kılarken GetHashCode metodunu da geçersiz kılın
- CA2225: İşleç aşırı yüklemelerinin isimlendirilmiş alternatifleri vardır
- CA2226: İşleçler simetrik aşırı yüklemelere sahip olmalıdır
- CA2231: ValueType.Equals'i geçersiz kılarken eşittir operatörünü aşırı yükleyin