Share via


CA2246: Wijs geen symbool en het bijbehorende lid toe aan dezelfde instructie

Eigenschappen Weergegeven als
Regel-id CA2246
Titel Wijs geen symbool en het bijbehorende lid in dezelfde instructie toe
Categorie Gebruik
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Als suggestie

Oorzaak

Een symbool en het bijbehorende lid zijn toegewezen in dezelfde instructie. Voorbeeld:

// 'a' and 'a.Field' are assigned in the same statement
a.Field = a = b;

Beschrijving van regel

Het toewijzen van een symbool en het bijbehorende lid, dat wil zeggen, een veld of eigenschap, in dezelfde instructie wordt niet aanbevolen. Het is niet duidelijk of de toegang tot het lid bedoeld is om de oude waarde van het symbool vóór de toewijzing of de nieuwe waarde van de toewijzing in deze instructie te gebruiken. Voor de duidelijkheid moet de instructie voor meerdere toewijzingen worden gesplitst in twee of meer eenvoudige toewijzingsinstructies.

Schendingen oplossen

Als u schendingen wilt oplossen, splitst u de instructie voor meerdere toewijzingen op in twee of meer eenvoudige toewijzingsinstructies. In het volgende codefragment ziet u bijvoorbeeld een schending van de regel en een aantal manieren om dit op te lossen op basis van de intentie van de gebruiker:

public class C
{
    public C Field;
}

public class Test
{
    public void M(C a, C b)
    {
        // Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
        // It is not clear if the user intent in the below statement is to assign to 'Instance1.Field' or 'Instance2.Field'.
        // CA2246: Symbol 'a' and its member 'Field' are both assigned in the same statement. You are at risk of assigning the member of an unintended object.
        a.Field = a = b;
    }
}
public class C
{
    public C Field;
}

public class Test
{
    public void M(C a, C b)
    {
        // Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
        // 'Instance1.Field' is intended to be assigned.
        var instance1 = a;
        a = b;
        instance1.Field = a;
    }
}
public class C
{
    public C Field;
}

public class Test
{
    public void M(C a, C b)
    {
        // Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
        // 'Instance2.Field' is intended to be assigned.
        a = b;
        b.Field = a; // or 'a.Field = a;'
    }
}

Wanneer waarschuwingen onderdrukken

Geen schendingen van deze regel onderdrukken.

Zie ook