ReSharper 2024.3 ヘルプ

コード検査: デフォルトの構造体の等価性の使用

このインスペクションは、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 フレームワーク 1.0 の導入以来、.NET 型システムは struct キーワードを介して C# の値型のサポートを提供してきました。構造体型が値のように動作することを保証するには、そのような型の構造的等価性を定義することが重要でした。これにより、対応するフィールドの値も等しい場合、任意の 2 つの構造体インスタンスが等しいと見なされます。この要件を満たすために、.NET ランタイムは、すべての構造体型に対して、通常、目的を果たす Equals/GetHashCode 仮想メソッドの既定の実装を提供します。

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

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

等価性チェック API

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

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

関連ページ:

コードインスペクション設定を構成する

設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...

アノテーションを使用してコードインスペクションを改善する

コード検査や他の多くの ReSharper の機能は、問題を検出し、改善を提案し、他の方法であなたを手助けするために、言語構成の動作を知ることに主に依存しています。ただし、この種の分析ではすべてを検出できるわけではありません。例: メソッドがフォーマットメソッドとして設計されている場合、メソッドの呼び出しに必要な引数が含まれていない場合、構造解析では潜在的な問題は見つかりません。この場合や他の多くの場合、ReSharper のは非常に役立ちます。このフレームワークで宣言された属性を使用することに...