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.

Voir aussi