コード検査: 構造体に 'IEquatable' 実装がありません (非公開アクセシビリティ)
このインスペクションは、この構造体のインスタンスを汎用コンテキストで比較するときに、パフォーマンスを向上させ、メモリオーバーヘッドを削減するために、構造体に IEquatable<T>
インターフェースを実装する必要があることを提案しています。この警告は、構造体が等価メンバーをオーバーライドし、構造体 (またはレコードなどの構造体を含む型) が実際に等価比較に使用される場合にのみ発行されます。
この場合、IEquatable<T>
を実装すると、次のような利点が得られます。
メモリ消費の削減:
IEquatable<T>
を実装していない構造体でEquals()
が呼び出されると、ランタイムは値型struct
を参照型object
に変換します。これにはボックス化が含まれ、値と必要なメタデータを保持するためにヒープ上に新しいオブジェクトが作成されます。IEquatable<T>
を実装した後、構造体をオブジェクトに変換せずに、Equals(T other)
またはEquals(object obj)
のカスタム実装を使用して構造体のインスタンスが直接比較されます。パフォーマンスの向上:
IEquatable<T>
を実装すると、等価比較を使用するList<T>
やDictionary<TKey , TValue>
などのコレクションのパフォーマンスが向上します。IEquatable<T>.Equals(T other)
は値型を直接操作するため、構造体のEquals(object)
に比べて高速です。
クイックフィックスとして、ReSharper は等価メンバー生成ダイアログを呼び出すのに役立ち、構造体に IEquatable<T>
を実装できます。
関連ページ:
コードインスペクション設定を構成する
設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...
等価メンバーを生成する
オブジェクトクラスでの等式メソッド(つまりおよび)および等式演算子(つまりおよび)の実装により、参照の等式が保証されます。作成するタイプ(最終的にから派生するため、デフォルトで参照の等価性を実装します)では、このタイプのオブジェクトの値の等価性を実装し、ハッシュコードをハッシュ目的の一意のオブジェクト識別子として使用することができます。この場合、タイプの等式メソッドと演算子をオーバーライドする必要があります。ReSharper を使用すると、等価メンバーを生成するコマンドを使用してこれらのルーチ...
コード検査: 'IsInstanceOfType()' 呼び出しを簡素化する
このインスペクションは、のような呼び出しを報告します。このような呼び出しは、またはとして簡略化できます。これらの式はすべて、セマンティクスとパフォーマンスの点で同一ですが、提案された代替手段により読みやすさが向上します。提案された変換には追加の安全上の利点があります。がの場合、との両方がを返すため、呼び出しによってスローされる可能性のあるが回避されます。public bool IsCompatibleWithString(object value) { return typeof(string)...