Problem GetHashCode () przy użyciu xor

Rozumiem, że zazwyczaj używasz xor z GetHashCode (), aby stworzyć int, aby zidentyfikować twoje dane według ich wartości (w przeciwieństwie do referencji). Oto prosty przykład:

<code>class Foo
{
    int m_a;
    int m_b;

    public int A
    {
        get { return m_a; }
        set { m_a = value; }
    }

    public int B
    {
        get { return m_b; }
        set { m_b = value; }
    }

    public Foo(int a, int b)
    {
        m_a = a;
        m_b = b;
    }

    public override int GetHashCode()
    {
        return A ^ B;
    }

    public override bool Equals(object obj)
    {
        return this.GetHashCode() == obj.GetHashCode();
    }
}
</code>

Chodzi o to, że chcę porównać jedną instancję Foo z inną na podstawie wartości właściwości A i B. Jeśli Foo1.A == Foo2.A i Foo1.B == Foo2.B, to mamy równość.

Oto problem:

<code>Foo one = new Foo(1, 2);
Foo two = new Foo(2, 1);

if (one.Equals(two)) { ... }  // This is true!
</code>

Oba te elementy dają wartość 3 dla GetHashCode (), powodując, że Equals () zwraca wartość true. Oczywiście jest to trywialny przykład i tylko dwie właściwości mógłbym po prostu porównać poszczególne właściwości w metodzie Equals (). Jednak przy bardziej złożonej klasie szybko wymknęłoby się to spod kontroli.

Wiem, że czasami dobrze jest ustawić kod skrótu tylko raz i zawsze zwracać tę samą wartość. Jednak dla obiektów zmiennych, w których konieczna jest ocena równości, nie sądzę, aby było to uzasadnione.

Jaki jest najlepszy sposób obsługi wartości właściwości, które można łatwo zamienić podczas implementacji GetHashCode ()?

Zobacz też

Jaki jest najlepszy algorytm dla przesłoniętego kodu System.Object.GetHashCode?

questionAnswers(7)

yourAnswerToTheQuestion