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
Règles associées
- CA1019 : Définir des accesseurs pour les arguments d'attribut
- CA1018 : Marquer les attributs avec AttributeUsageAttribute