Megosztás a következőn keresztül:


CA2231: A túlterhelési operátor egyenlő a ValueType.Equals felülbírálásával

Tulajdonság Érték
Szabályazonosító CA2231
Cím A túlterhelési operátor egyenlő a ValueType.Equals felülbírálásával
Kategória Használat
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

Az értéktípus felülbírál, System.Object.Equals de nem valósítja meg az egyenlőségi operátort.

Ez a szabály alapértelmezés szerint csak külsőleg látható típusokat tekint meg, de ez konfigurálható.

Szabály leírása

A legtöbb programozási nyelvben nincs alapértelmezett implementációja az egyenlőségi operátornak (==) az értéktípusokhoz. Ha a programozási nyelv támogatja az operátorok túlterhelését, érdemes megfontolni az egyenlőségi operátor implementálását. A viselkedésének meg kell egyeznie Equalsa .

Az egyenlőségi operátor túlterhelt megvalósításában nem használhatja az alapértelmezett egyenlőségi operátort. Ha így tesz, akkor a verem túlcsordul. Az egyenlőségi operátor implementálásához használja az Object.Equals metódust a megvalósításban. Például:

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);

Szabálysértések kijavítása

A szabály megsértésének kijavításához hajtsa végre az egyenlőségi operátort.

Mikor kell letiltani a figyelmeztetéseket?

A szabályból származó figyelmeztetéseket nyugodtan el lehet tiltani; javasoljuk azonban, hogy lehetőség szerint adja meg az egyenlőségi operátort.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA2231
// The code that's violating the rule is on this line.
#pragma warning restore CA2231

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA2231.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

Kód konfigurálása elemzéshez

A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.

Ezt a beállítást konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában (Használat) érvényes összes szabályra. További információ: Kódminőségi szabály konfigurációs beállításai.

Adott API-felületek belefoglalása

A kódbázis azon részeit konfigurálhatja, amelyeken futtathatja ezt a szabályt az akadálymentességük alapján. Ha például meg szeretné adni, hogy a szabály csak a nem nyilvános API-felületen fusson, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Példa

Az alábbi példa egy olyan típust határoz meg, amely megsérti ezt a szabályt:

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));
    }
}

Kapcsolódó információk