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