Share via


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

Siehe auch

Referenz

Richtlinien für die Verwendung von Attributen

System.AttributeTargets