我有一個項目,我廣泛使用通用C#dictionary。我需要複合鍵,所以我一直在使用tuples作爲鍵。在某些時候,我不知道這是否將是有益的要使用的緩存哈希代碼自定義類:爲什麼C#字典不調用隱藏的GetHashCode方法
public class CompositeKey<T1, T2> : Tuple<T1, T2>
{
private readonly int _hashCode;
public CompositeKey(T1 t1, T2 t2) : base(t1, t2)
{
_hashCode = base.GetHashCode();
}
public new int GetHashCode()
{
return _hashCode;
}
}
我用new
代替override
,因爲我認爲它不會有所作爲此測試,因爲我被定義使用的具體類型的詞典:
var dict = new Dictionary<CompositeKey<string, int>, int>();
我注意到了,但是,我的自定義GetHashCode
方法不被調用。當我將new
更改爲override
時,它按預期調用。
有人可以解釋爲什麼隱藏的GetHashCode
方法沒有被調用?我希望這個行爲,如果我將定義字典這樣
var dict = new Dictionary<Tuple<string, int>, int>();
但如果我明確指定CompositeKey
類型,在我的例子。
P.S.我知道隱藏GetHashCode
方法可能不是一個好主意。
隱藏是一個壞主意,因爲它會導致此問題! – AndyJ
這裏有一篇文章解釋新的和重寫的區別... http://stackoverflow.com/questions/1399127/difference-between-new-and-override – AndyJ
作爲一邊,如果你認爲你的hashcode算法需要緩存它可能是一個不好的算法,或者你不必要地緩存。 –