CA1018: Attribute mit AttributeUsageAttribute markieren.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1018 |
Titel | Attribute mit AttributeUsageAttribute markieren. |
Kategorie | Design |
Fix führt oder führt nicht zur Unterbrechung | Breaking |
Standardmäßig in .NET 9 aktiviert | Als Vorschlag |
Ursache
Das System.AttributeUsageAttribute-Attribut ist für das benutzerdefinierte Attribut nicht vorhanden.
Regelbeschreibung
Wenn Sie ein benutzerdefiniertes Attribut definieren, markieren Sie es mithilfe von AttributeUsageAttribute, um anzugeben, an welcher Stelle im Quellcode das benutzerdefinierte Attribut angewendet werden kann. Die Bedeutung und die beabsichtigte Verwendung eines Attributs bestimmen die gültigen Positionen des Attributs im Code. Beispielsweise können Sie ein Attribut definieren, mit dem die Person identifiziert wird, die für die Verwaltung und Erweiterung der einzelnen Typen in einer Bibliothek zuständig ist, und dass die Verantwortlichkeit immer auf der Typebene zugewiesen wird. In diesem Fall sollten Compiler das Attribut für Klassen, Enumerationen und Schnittstellen aktivieren, diese aber nicht für Methoden, Ereignisse oder Eigenschaften aktivieren. Organisationsrichtlinien und -prozeduren würden vorschreiben, ob das Attribut für Assemblys aktiviert werden soll.
Die System.AttributeTargets-Enumeration definiert die Ziele, die Sie für ein benutzerdefiniertes Attribut angeben können. Wenn Sie AttributeUsageAttribute weglassen, ist das benutzerdefinierte Attribut für alle Ziele gültig, wie durch den All
-Wert der AttributeTargets-Enumeration definiert.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, geben Sie Ziele für das Attribut an, indem Sie AttributeUsageAttribute verwenden. Siehe folgendes Beispiel.
Wann sollten Warnungen unterdrückt werden?
Sie sollten einen Verstoß gegen diese Regel beheben, anstatt die Meldung auszuschließen. Auch wenn das Attribut AttributeUsageAttribute erbt, sollte das Attribut vorhanden sein, um die Codeverwaltung zu vereinfachen.
Beispiel
Im folgenden Beispiel werden zwei Schnittstellen definiert. BadCodeMaintainerAttribute
lässt die AttributeUsageAttribute AnweisungGoodCodeMaintainerAttribute
fälschlicherweise aus und implementiert das Attribut, das weiter oben in diesem Abschnitt beschrieben wird. (Die DeveloperName
-Eigenschaft wird von der Entwurfsregel CA1019: Definieren von Accessoren für Attributargumente benötigt und ist aus Gründen der Vollständigkeit enthalten.)
using System;
namespace ca1018
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute : Attribute
{
public BadCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
// Satisfies rule: Attributes specify AttributeUsage.
// This attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute : Attribute
{
public GoodCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
}
Imports System
Namespace ca1018
' Violates rule: MarkAttributesWithAttributeUsage.
Public NotInheritable Class BadCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
End Class
' Satisfies rule: Attributes specify AttributeUsage.
' The attribute is valid for type-level targets.
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Enum Or
AttributeTargets.Interface Or AttributeTargets.Delegate)>
Public NotInheritable Class GoodCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
End Class
End Namespace