CA2011 : Ne pas assigner la propriété dans son setter
Propriété | Value |
---|---|
Identificateur de la règle | CA2011 |
Titre | Ne pas assigner la propriété dans son setter |
Catégorie | Fiabilité |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | À titre de suggestion |
Cause
Une propriété a été affectée accidentellement à une valeur au sein de son propre accesseur set.
Description de la règle
L’assignation d’une propriété à elle-même dans son accesseur set conduit à une chaîne infinie d’appels récursifs à l’accesseur set. Il en résulte une StackOverflowException à l’exécution. Une telle erreur est courante lorsque la propriété et le champ de stockage permettant de stocker la valeur de propriété portent un nom similaire. La valeur a été accidentellement assignée à la propriété elle-même au lieu du champ de stockage.
Comment corriger les violations
Pour corriger les violations, remplacez l’assignation à la propriété qui pose problème par une assignation au champ de stockage ou passez à une propriété automatique. Par exemple, l’extrait de code suivant montre une violation de la règle et indique comment la corriger :
public class C
{
// Backing field for property 'P'
private int p;
public int P
{
get
{
return p;
}
set
{
// CA2011: Accidentally assigned to property, instead of the backing field.
P = value;
}
}
}
public class C
{
// Backing field for property 'P'
private int _p;
public int P
{
get
{
return _p;
}
set
{
// Option 1: Assign to backing field and rename the backing field for clarity.
_p = value;
}
}
}
public class C
{
// Option 2: Use auto-property.
public int P { get; set; }
}
Quand supprimer les avertissements
Il est préférable de supprimer les violations de cette règle si vous avez la certitude que les appels récursifs à l’accesseur set sont assortis d’une protection conditionnelle qui empêche la récursivité infinie.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA2011
// The code that's violating the rule is on this line.
#pragma warning restore CA2011
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA2011.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.