CA1018: Attribute mit AttributeUsageAttribute markieren
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
Kategorie (Category) |
Microsoft.Design |
Unterbrechende Änderung |
Breaking |
Ursache
Das AttributeUsageAttribute-Attribut ist im benutzerdefinierten 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.Sie könnten z. B. ein Attribut definieren, das die Person identifiziert, die für das Beibehalten und Verbessern jedes Typs in einer Bibliothek zuständig ist, und diese Verantwortung wird immer auf Typebene zugewiesen.In diesem Fall sollten Compiler das Attribut bei Klassen, Enumerationen und Schnittstellen aktivieren, nicht aber bei Methoden, Ereignissen oder Eigenschaften.Ob das Attribut in Assemblys aktiviert werden sollte, würde dann von Organisationsrichtlinien und Prozeduren bestimmt.
Die 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 vom 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 mithilfe von AttributeUsageAttribute an.(Siehe nachstehendes 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 es vorhanden sein, da dadurch die Codewartung vereinfacht wird.
Beispiel
Im folgenden Beispiel werden zwei Attribute definiert.BadCodeMaintainerAttribute lässt die AttributeUsageAttribute-Anweisung fälschlicherweise weg, und GoodCodeMaintainerAttribute implementiert korrekterweise das Attribut, das in diesem Abschnitt früher beschrieben wurde.Beachten Sie, dass die DeveloperName-Eigenschaft von der Entwurfsregel CA1019: Accessors für Attributargumente definieren benötigt wird und der Vollständigkeit halber eingefügt wird.
Imports System
Namespace DesignLibrary
' Violates rule: MarkAttributesWithAttributeUsage.
NotInheritable Public Class BadCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
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)> _
NotInheritable Public Class GoodCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
End Class
End Namespace
using System;
namespace DesignLibrary
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute :Attribute
{
string developer;
public BadCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
// Satisfies rule: Attributes specify AttributeUsage.
// The attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute :Attribute
{
string developer;
public GoodCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
}
Verwandte Regeln
CA1019: Accessors für Attributargumente definieren
CA1813: Nicht versiegelte Attribute vermeiden