Freigeben über


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

Siehe auch

Weitere Ressourcen

Attribute Usage Guidelines