CA2245: Tilldela inte en egenskap till sig själv
Property | Värde |
---|---|
Regel-ID | CA2245 |
Title | Tilldela inte en egenskap till sig själv |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
En egenskap tilldelades av misstag till sig själv.
Regelbeskrivning
C#-kompilatorn genererar en varnings-CS1717 : Tilldelning till samma variabel. Menade du att tilldela något annat? när ett fält, en lokal symbol eller en parametersymbol tilldelas till sig själv. Ett sådant misstag är vanligt när en lokal symbol, parameter eller fältsymbol har ett namn som liknar en annan symbol i omfånget. I stället för att använda olika symboler på vänster och höger sida av tilldelningen användes samma symbol på båda sidor. Detta leder till en redundant tilldelning av värdet till sig själv och indikerar vanligtvis en funktionell bugg.
Att tilldela en egenskap till sig själv är också en liknande funktionell bugg för nästan alla verkliga fall. Men i vissa extrema hörnfall kan hämtning av ett egenskapsvärde ha biverkningar och egenskapens nya värde skiljer sig från det ursprungliga värdet. I så fall är egenskapens självtilldelning inte redundant och kan inte tas bort. Detta förhindrar att kompilatorn genererar en CS1717
varning för självtilldelning av egenskapen, utan att någon icke-bakåtkompatibel ändring införs för dessa fall.
Syftet med regeln CA2245
är att fylla denna lucka. Den rapporterar överträdelsen för självtilldelning av egenskapen för att hjälpa till att åtgärda dessa funktionella buggar. För den lilla uppsättningen hörnfall där självtilldelning av egenskapen är önskvärd CA2245
kan överträdelser ignoreras i källan med en lämplig motiveringskommentar.
Så här åtgärdar du överträdelser
Om du vill åtgärda överträdelser använder du olika symboler till vänster och till höger om tilldelningen. Följande kodfragment visar till exempel ett brott mot regeln och hur du åtgärdar den:
public class C
{
private int p = 0;
public int P { get; private set; }
public void M(int p)
{
// CS1717: Accidentally assigned the parameter 'p' to itself.
p = p;
// CA2245: Accidentally assigned the property 'P' to itself.
P = P;
}
}
public class C
{
private int p = 0;
public int P { get; private set; }
public void M(int p)
{
// No violation, now the parameter is assigned to the field.
this.p = p;
// No violation, now the parameter is assigned to the property.
P = p;
}
}
När du ska ignorera varningar
Det är säkert att förhindra överträdelser från den här regeln om hämtning av ett egenskapsvärde kan ha biverkningar och egenskapens nya värde skiljer sig från det ursprungliga värdet. I så fall är egenskapens självtilldelning inte redundant. En motiveringskommentare bör läggas till i undertryckningen för att dokumentera detta som förväntat beteende.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2245
// The code that's violating the rule is on this line.
#pragma warning restore CA2245
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2245.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Relaterade regler
- CS1717: Tilldelning till samma variabel; Menade du att tilldela något annat?
- CA2011: Tilldela inte egenskapen i dess setter
- CA2246: Tilldela inte en symbol och dess medlem i samma instruktion