JetBrains Rider 2026.1 Help

コードインスペクション: デフォルト構造体等値の使用

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

以下の例では、 Points 辞書は MyPoint 構造体をキーとして使用します。 つまり、 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 を介して使用される場合にのみ報告されます。

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

2026 年 6 月 12 日