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 8 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

Siehe auch