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.