CA2218: オーバーライドする Equals で GetHashCode をオーバーライドします

プロパティ
ルール ID CA2218
Title オーバーライドする Equals で GetHashCode をオーバーライドします
[カテゴリ] 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

パブリック型で System.Object.Equals をオーバーライドしていますが、System.Object.GetHashCode をオーバーライドしていません。

規則の説明

GetHashCode は、現在のインスタンスに基づいて、ハッシュ アルゴリズムとデータ構造 (ハッシュ テーブルなど) に適した値を返します。 型が同じで、かつ等価の 2 つのオブジェクトからは同じハッシュ コードが返されないと、次の型のインスタンスは正しく機能しません。

メモ

この規則は Visual Basic コードにのみ適用されます。 C# コンパイラでは、別個の警告 CS0659 が生成されます。

違反の修正方法

この規則違反を修正するには、GetHashCode を実装します。 同じ型のオブジェクト ペアについては、Equals を実装したとき、ペアの true が返される場合、実装によって同じ値が返されるようにします。

どのようなときに警告を抑制するか

この規則による警告は抑制しないでください。

クラスの例

次の例では、この規則に違反するクラス (参照型) を確認できます。

' 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

次の例では、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

関連項目