コードインスペクション: 'GetHashCode()' で参照される非読み取り専用型メンバー
GetHashCode() メソッドの Microsoft のドキュメントでは、このメソッドのオーバーライドによってオブジェクトの存続期間中に変更されない値が返されることが明示的に要求されていません。 特に、言う:
オブジェクトの GetHashCode メソッドは、オブジェクトの Equals メソッドの戻り値を決定するオブジェクトの状態に変更がない限り、常に同じハッシュコードを返す必要があります。
一方、オブジェクトがコレクション内にあるときは、少なくともハッシュコードは変更しないでください:
イミュータブルな参照型の場合、GetHashCode をオーバーライドできます。 一般的に、ミュータブルな参照型の場合、次の条件を満たす場合のみ GetHashCode をオーバーライドするべきです:
変更不可なフィールドからハッシュコードを計算できる場合、または
ハッシュコードに依存するコレクションにオブジェクトが含まれている間はミュータブルなオブジェクトのハッシュコードが変わらないようにできる場合
そもそもなぜ GetHashCode() をオーバーライドする必要があるのでしょうか? 通常、オブジェクトが Hashtable や辞書のキーなどとして使われる場合に行いますが、いつコレクションに追加され、どれくらい保持されるかを予測するのは難しいです。
安全な側にいたい場合は、 GetHashCode() のオーバーライドがオブジェクトの存続期間中に同じ値を返すことを確認してください。 JetBrains Rider は、実装の GetHashCode() にある非読み取り専用フィールドや非取得専用プロパティを指摘してサポートします。 可能であれば、JetBrains Rider はこれらのメンバーを読み取り専用 / 取得専用にするための クイックフィックス を提案します。