コードインスペクション:構造体に 'IEquatable' 実装がありません(非公開以外のアクセシビリティ)
このインスペクションは、この構造体のインスタンスを汎用コンテキストで比較するときに、パフォーマンスを向上させ、メモリオーバーヘッドを削減するために、構造体に IEquatable<T> インターフェースを実装する必要があることを提案しています。 この警告は、構造体が等価メンバーをオーバーライドし、構造体 (またはレコードなどの構造体を含む型) が実際に等価比較に使用される場合にのみ発行されます。
この場合、 IEquatable<T> を実装すると、次のような利点が得られます。
メモリ消費の削減:
Equals()が、IEquatable<T>を実装していない構造体で呼び出されると、ランタイムが値型structを参照型objectに変換します。これはボックス化を伴い、値や必要なメタデータを保持する新しいオブジェクトをヒープ上に作成します。IEquatable<T>を実装した後、構造体をオブジェクトに変換せずに、Equals(T other)またはEquals(object obj)のカスタム実装を使用して構造体のインスタンスが直接比較されます。パフォーマンスの向上:
IEquatable<T>を実装すると、等価比較を使用するList<T>やDictionary<TKey , TValue>などのコレクションのパフォーマンスが向上します。IEquatable<T>.Equals(T other)は値型を直接操作するため、構造体のEquals(object)に比べて高速です。
クイックフィックスとして、JetBrains Rider は 等価メンバー生成ダイアログを呼び出すのに役立ち、構造体に IEquatable<T> を実装するのをサポートします。