Attribute mit AttributeUsageAttribute markieren
Aktualisiert: November 2007
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
Kategorie |
Microsoft.Design |
Unterbrechende Änderung |
Breaking |
Ursache
Das System.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 eines Attributs und dessen beabsichtigte Verwendung bestimmen die gültigen Positionen des Attributs im Code. Beispiel: Sie definieren ein Attribut, mit dem die Person bezeichnet wird, die für die Wartung und Verbesserung jedes Typs in einer Bibliothek verantwortlich ist, und die Verantwortlichkeit ist stets auf Typebene zugewiesen. In diesem Fall sollte das Attribut von Compilern in Klassen, Enumerationen und Schnittstellen, jedoch nicht in Methoden, Ereignissen oder Eigenschaften zugelassen werden. Ob das Attribut in Assemblys zugelassen werden sollte, würde dann von Organisationsrichtlinien und Prozeduren bestimmt.
Die System.AttributeTargets-Enumeration definiert die Ziele, die Sie für ein benutzerdefiniertes Attribut angeben können. Wenn Sie AttributeUsageAttribute weglassen, gilt das benutzerdefinierte Attribut für alle Ziele, wie durch All definiert.
Behandlung 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. In BadCodeMaintainerAttribute wird unzulässigerweise die AttributeUsageAttribute-Anweisung weggelassen, während GoodCodeMaintainerAttribute das oben beschriebene Attribut ordnungsgemäß implementiert. Beachten Sie, dass die DeveloperName-Eigenschaft von der Entwurfsregel Accessoren 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
Accessoren für Attributargumente definieren
Nicht versiegelte Attribute vermeiden