CA1813 : Évitez les attributs unsealed

Propriété Value
Identificateur de la règle CA1813
Titre Évitez les attributs unsealed
Catégorie Performances
Le correctif est cassant ou non cassant Rupture
Activé par défaut dans .NET 8 Non

Cause

Un type public hérite de System.Attribute, n’est pas abstrait et n’est pas sealed (NotInheritable en Visual Basic).

Description de la règle

.NET fournit des méthodes pour récupérer des attributs personnalisés. Par défaut, ces méthodes recherchent la hiérarchie d'héritage des attributs. Par exemple, System.Attribute.GetCustomAttribute recherche le type d’attribut spécifié ou tout type d’attribut qui étend le type d’attribut spécifié. Le fait de sceller l’attribut élimine la recherche dans la hiérarchie d’héritage et peut améliorer les performances.

Comment corriger les violations

Pour corriger une violation de cette règle, scellez le type d’attribut ou rendez-le abstrait.

Quand supprimer les avertissements

Vous pouvez supprimer un avertissement de cette règle. Supprimez uniquement si vous définissez une hiérarchie d’attributs et ne pouvez pas sceller l’attribut ou le rendre abstrait.

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 CA1813
// The code that's violating the rule is on this line.
#pragma warning restore CA1813

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.CA1813.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemple

L’exemple suivant illustre un attribut personnalisé qui satisfait à cette règle.

// Satisfies rule: AvoidUnsealedAttributes.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public sealed class DeveloperAttribute : Attribute
{
    private string nameValue;
    public DeveloperAttribute(string name)
    {
        nameValue = name;
    }

    public string Name
    {
        get
        {
            return nameValue;
        }
    }
}
Imports System

Namespace ca1813

    ' Satisfies rule: AvoidUnsealedAttributes.
    <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Struct)>
    Public NotInheritable Class DeveloperAttribute
        Inherits Attribute

        Public Sub New(name As String)
            Me.Name = name
        End Sub


        Public ReadOnly Property Name() As String
    End Class

End Namespace

Voir aussi