「可変」オブジェクト(GetHashCode()メソッドがディクショナリでキーとして使用されているときに異なる結果を返す可能性があるオブジェクト)を使用することはお勧めできないことを理解しています。
以下は、ハッシュテーブルとして実装されているディクショナリがどのように機能するかについての私の理解です。
たとえばdict.Add(m1, "initially here was m1 object");
、新しいキーを追加する場合、メソッドを使用するdict
ハッシュコードを計算します。次に、いくつかの内部計算を実行し、最後にこのオブジェクトを内部配列のある位置に配置します。m1
GetHashCode()
たとえば、キーインデックスを使用して値を取得している場合、dict[m1]
ハッシュdict
コードを再度計算します。次に、いくつかの内部計算を実行し、内部配列内の計算された位置にあるオブジェクトを取得します。
しかし、私が見つけることができないエラーがあると思います。
だから私がこのコードを持っていると仮定しましょう:
class MutableObject
{
Int32 m_value;
public MutableObject(Int32 value)
{
m_value = value;
}
public void Mutate(Int32 value)
{
m_value = value;
}
public override int GetHashCode()
{
return m_value;
}
}
static void Main(string[] args)
{
MutableObject m1 = new MutableObject(1);
MutableObject m2 = new MutableObject(2);
var dict = new Dictionary<MutableObject, String>();
dict.Add(m1, "initially here was m1 object");
dict.Add(m2, "initially here was m2 object");
Console.WriteLine("Before mutation:");
Console.WriteLine("dict[m1] = " + dict[m1]);
Console.WriteLine("dict[m2] = " + dict[m2]);
m1.Mutate(2);
m2.Mutate(1);
Console.WriteLine("After mutation:");
Console.WriteLine("dict[m1] = " + dict[m1]);
Console.WriteLine("dict[m2] = " + dict[m2]);
Console.ReadKey(true);
}
メソッドを呼び出すとMutate
、キーが交換されます。だから私はそれが交換された結果を与えるだろうと思った。しかし、実際にはこの行Console.WriteLine("dict[m1] = " + dict[m1]);
はKeyNotFoundExceptionをスローし、その理由を理解できません。明らかに私はここで何かが欠けています...