Share via


CA2218: Equals를 재정의할 때 GetHashCode를 재정의하십시오.

속성
규칙 ID CA2218
타이틀 Equals를 재정할 때 GetHashCode를 재정의하세요.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

퍼블릭 형식은 System.Object.Equals를 재정의하지만 System.Object.GetHashCode를 재정의하지 않습니다.

규칙 설명

GetHashCode는 현재 인스턴스를 기반으로 해싱 알고리즘 및 해시 테이블과 같은 데이터 구조체에 적합한 값을 반환합니다. 동일한 형식이고 동일한 두 개체가 동일한 해시 코드를 반환하여 다음 형식의 인스턴스가 제대로 작동하는지 확인해야 합니다.

참고 항목

이 규칙은 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

참고 항목