Sdílet prostřednictvím


Überladen Sie den Gleichheitsoperator beim Überschreiben von ValueType.Equals

Aktualisiert: November 2007

     TypeName

OverloadOperatorEqualsOnOverridingValueTypeEquals

CheckId

CA2231

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein Werttyp überschreibt Object.Equals, implementiert jedoch den Gleichheitsoperator nicht.

Regelbeschreibung

In den meisten Programmiersprachen gibt es keine Standardimplementierung des Gleichheitsoperators (==) für Werttypen. Wenn die verwendete Programmiersprache Operatorüberladungen unterstützt, sollten Sie erwägen, den Gleichheitsoperator zu implementieren. Das Verhalten des Gleichheitsoperators sollte mit dem von Equals übereinstimmen.

Sie können den Standardgleichheitsoperator nicht in einer überladenen Implementierung des Gleichheitsoperators verwenden. Eine solche Vorgehensweise führt zu einem Stapelüberlauf. Verwenden Sie zur Implementierung des Gleichheitsoperators die Object.Equals-Methode. Beispiel:

If (Object.ReferenceEquals(left, Nothing)) Then
    Return Object.ReferenceEquals(right, Nothing)
Else
    Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null)) 
    return Object.ReferenceEquals(right, null);
return left.Equals(right);

Behandlung von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie den Gleichheitsoperator.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann gefahrlos unterdrückt werden. Es wird jedoch empfohlen, den Gleichheitsoperator bereitzustellen, falls dies möglich ist.

Beispiel

Im folgenden Beispiel wird ein Typ definiert, der gegen diese Regel verstößt.

using System;

namespace UsageLibrary
{
    public struct PointWithoutHash
    {
        private int x,y;

        public PointWithoutHash(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public override string ToString()
        {
            return String.Format("({0},{1})",x,y);
        }

        public int X {get {return x;}}

        public int Y {get {return x;}}

        // Violates rule: OverrideGetHashCodeOnOverridingEquals.
        // Violates rule: OverrideOperatorEqualsOnOverridingValueTypeEquals.
        public override bool Equals (object obj)
        {
            if (obj.GetType() != typeof(PointWithoutHash))
                return false;

            PointWithoutHash p = (PointWithoutHash)obj;   
            return ((this.x == p.x) && (this.y == p.y));
        }

    }

}

Verwandte Regeln

Gleichheitsoperator bei Referenztypen nicht überladen

Operatorüberladungen haben benannte Alternativen

Operatoren sollten symmetrische Überladungen haben

Equals beim Überladen des Gleichheitsoperators überschreiben

GetHashCode beim Überschreiben von Equals überschreiben

Siehe auch

Referenz

Object.Equals