短い質問:object.GetHashCode()
の値は、GetHashCode()
を再実装したオブジェクトにどのようにして取得しますか?GetHashCodeを再実装するクラスから生のハッシュコードを取得するには?
ロングストーリー 私は約10万のオブジェクトを持ち、それぞれが多くの(コンパイル時以外の)共通の文字列を共有しています。値が等しい場合と同じように、同じインスタンスです。
これを知って、私はむしろ完全な文字列の比較ではなく、標準的なオブジェクト比較(ReferenceEquals
)を使用したいと思っています。これらは辞書でかなり定期的に検索されます。
したがって、をDictionary<string, TValue>
と一緒に使用すると宣言して、とにかく持っていると便利だと考えて、2つの方法を実装しようとします。
同等は十分です。object.ReferenceEquals
を使用してください。
GetHashCode
の方法では、object.GetHashCode()
の相当品を取得するにはどうすればよいですか?
つまり、オブジェクトのインスタンスの表現方法を教えてください。
私はこのことについて行くことができる他の方法があります知っているからstring
への参照を保持しているInternedString
クラスを作成しますが、しかし、各オブジェクトと文字列ではなく、Equals
またはGetHashCode
、またはストアインデックスを実装していないが、私は」私は今興味があります - 実際にはReferenceEqualityComparer
の汎用を実装する方法はありますか?
Jon Skeetは、あなたがやっていることをどうやって行うかについて、簡単で正確な答えを提供します。しかし、私の考えは、文字列への参照を保持し、GetHashCodeとEqualsをオーバーライドして、囲まれた文字列のRuntimeHelpers.GetHashCodeまたはObject.ReferenceEqualsを呼び出す単純な不変構造に各文字列をラップすることです。 – supercat
String型の公開オブジェクトでReferenceEqualsを使用するのは好きではありません。多くのコードでは、プログラムのセマンティクスに影響を与えずに、Stringオブジェクトを同じ長さと内容で置き換えることができます。ほとんどの場合、参照型と非常によく似た動作をする必要があります。私が気づいている最大の問題は、Objectまたはインターフェイスタイプにキャストされた場合、そのような型がボックス化されるということです。 – supercat
こんにちはsupercat、これはyesのオプションになります。ただし、すべての文字列は不変の内部クラスでのみ使用されています。パブリックではなく、ルール破りの文字列で置き換えられる危険はありません。しかし、私は正しさのためにあなたの提案に従うかもしれません - 昨日、RuntimeHelpersの知識がなければ、私はどのようにデフォルトのstruct.GetHashCodeが悪いほど遅いのでしょうか? – Mania