ReSharper 2026.1 Help

コードインスペクション:デフォルトの等値メンバーを持つ構造体が比較に使用されています(非プライベートのアクセスレベル)

このインスペクションは、 Equals/GetHashCode オーバーライドがなく、現在のソリューションで 使用されている構造体型を報告します。 このような構造体を使用すると、パフォーマンスに悪影響を与える可能性があります。

以下の例では、 MyPoint 構造体が Points 辞書のキーとして使用されています。 つまり、 Points を使用すると、暗黙的に Equals/GetHashCode次善のデフォルト実装が呼び出されます。

public class Test { public Dictionary<MyPoint, string> Points = new(); } public struct MyPoint { public int X, Y; // No Equals/GetHashCode overrides }

このパフォーマンス問題を解決するには、クイックフィックスを利用して構造体に Equals/GetHashCode の実装を生成するか、 struct の宣言を record struct に変更してください。これにより C# コンパイラーが適切な Equals/GetHashCode の実装を自動で生成します。

構造体の Equals/GetHashCode のデフォルト実装によるパフォーマンスの問題

.NET Framework 1.0 の導入以来、.NET 型システムは C# における値型を struct キーワードでサポートしています。 構造体型が値のように振る舞うことを保証するためには、その型に対して 構造的な等値性を定義することが重要でした。対応するフィールドの値が同じであれば、構造体インスタンスも等価と見なされるべきです。 この要件を満たすため、.NET ランタイムは全ての構造体型に Equals/GetHashCode 仮想メソッドのデフォルト実装を提供しており、おおむね機能しています。

ただし、ランタイムが提供する Equals/GetHashCode の既定の実装には重大な問題があります。 すべての可能な構造体型で動作するために、 Equals/GetHashCode の実装ではボックス化割り当て (構造体値の統一された表現をマネージ参照として取得するため) が使用され、フィールド値の取得にはリフレクションメカニズムに依存します。 さらに、既定の GetHashCode 実装では、最初の非 null 参照型フィールドのハッシュコードが使用されるため、構造体に複数のフィールドが含まれている場合はハッシュコードの分散が悪くなる可能性があります。 アプリケーションの重要な実行パスに沿って構造の等価性がチェックされる場合は、独自の Equals/GetHashCode 実装を定義することが非常に重要になります。

詳細については、 Microsoft 開発者サポート: C# におけるデフォルトの構造体の等価性のパフォーマンスへの影響(英語)を参照してください。

等価性チェック API

この問題は、 Equals/GetHashCode 実装のない構造体が、実際に内部で等価性チェックを実行する API を介して使用される場合にのみ報告されます。

ReSharper は、システムや一般的なライブラリにあるほとんどのこのような API パターンを認識します。 カスタム API の場合は、 JetBrains.Annotations[DefaultEqualityUsageAttribute] を使用して同様の問題を検出できます。

2026 年 6 月 12 日