CA2218: Equals를 재정의할 때 GetHashCode를 재정의하십시오.
속성 | 값 |
---|---|
규칙 ID | CA2218 |
제목 | Equals를 재정할 때 GetHashCode를 재정의하세요. |
범주 | 사용 현황 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 제안 사항 |
원인
퍼블릭 형식은 System.Object.Equals를 재정의하지만 System.Object.GetHashCode를 재정의하지 않습니다.
규칙 설명
GetHashCode는 현재 인스턴스를 기반으로 해싱 알고리즘 및 해시 테이블과 같은 데이터 구조체에 적합한 값을 반환합니다. 동일한 형식이고 동일한 두 개체가 동일한 해시 코드를 반환하여 다음 형식의 인스턴스가 제대로 작동하는지 확인해야 합니다.
- System.Collections.Hashtable
- System.Collections.SortedList
- System.Collections.Generic.Dictionary<TKey,TValue>
- System.Collections.Generic.SortedDictionary<TKey,TValue>
- System.Collections.Generic.SortedList<TKey,TValue>
- System.Collections.Specialized.HybridDictionary
- System.Collections.Specialized.ListDictionary
- System.Collections.Specialized.OrderedDictionary
- System.Collections.Generic.IEqualityComparer<T>을 구현하는 형식
참고 항목
이 규칙은 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
관련 규칙
- CA1046: 참조 형식에 같음 연산자를 오버로드하지 마십시오.
- CA2224: 같음 연산자를 오버로드할 때 Equals를 재정의하십시오.
- CA2225: 연산자 오버로드에는 명명된 대체 항목이 있습니다.
- CA2226: 연산자에는 대칭 오버로드가 있어야 합니다.
- CA2231: ValueType.Equals를 재정의할 때 같음 연산자를 오버로드하십시오.
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET