CA2218: オーバーライドする Equals で GetHashCode をオーバーライドします
プロパティ | 値 |
---|---|
ルール ID | CA2218 |
Title | オーバーライドする Equals で GetHashCode をオーバーライドします |
[カテゴリ] | 使用方法 |
修正が中断ありか中断なしか | なし |
.NET 8 では既定で有効 | 提案として |
原因
パブリック型で System.Object.Equals をオーバーライドしていますが、System.Object.GetHashCode をオーバーライドしていません。
規則の説明
GetHashCode は、現在のインスタンスに基づいて、ハッシュ アルゴリズムとデータ構造 (ハッシュ テーブルなど) に適した値を返します。 型が同じで、かつ等価の 2 つのオブジェクトからは同じハッシュ コードが返されないと、次の型のインスタンスは正しく機能しません。
- 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: 参照型で、演算子 equals をオーバーロードしないでください
- CA2224: オーバーロードする演算子 equals で Equals をオーバーライドします
- CA2225: 演算子オーバーロードには名前付けされた代替が存在します
- CA2226: 演算子は対称型オーバーロードを含まなければなりません
- CA2231: ValueType.Equals のオーバーライドで、演算子 equals をオーバーロードします
関連項目
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET