CA1019: Accessors für Attributargumente definieren

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

Kategorie (Category)

Microsoft.Design

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein Attribut definiert in seinem Konstruktor Argumente, die nicht über entsprechende Eigenschaften verfügen.

Regelbeschreibung

Attribute können obligatorische Argumente definieren, die angegeben werden müssen, wenn das Attribut auf ein Ziel angewendet wird.Diese Argumente werden auch als positionelle Argumente bezeichnet, da sie bei Attributkonstruktoren als positionelle Parameter angegeben werden.Für jedes obligatorische Argument muss das Attribut außerdem eine entsprechende schreibgeschützte Eigenschaft enthalten, damit der Wert des Arguments zur Ausführungszeit abgerufen werden kann.Mit dieser Regel wird festgestellt, ob Sie für jeden Konstruktorparameter die entsprechende Eigenschaft definiert haben.

Attribute können auch optionale Argumente definieren, die auch als benannte Argumente bezeichnet werden.Diese Argumente werden bei Attributkonstruktoren über ihren Namen angegeben und sollten über eine entsprechende Lese-Schreib-Eigenschaft verfügen.

Bei obligatorischen und optionalen Argumenten sollten für die entsprechenden Eigenschaften und Konstruktorparameter der gleiche Name, jedoch eine andere Schreibweise verwendet werden.Bei Eigenschaften wird die Pascal-Schreibweise, bei Parametern die Kamel-Schreibweise verwendet.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, fügen Sie eine schreibgeschützte Eigenschaft für jeden Konstruktorparameter hinzu, der nicht über eine solche Eigenschaft verfügt.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Warnung dieser Regel, wenn der Wert des obligatorischen Arguments nicht abrufbar sein soll.

Beispiel für benutzerdefinierte Attribute

Beschreibung

Im folgenden Beispiel werden zwei Attribute veranschaulicht, die einen obligatorischen (positionellen) Parameter definieren.Die erste Implementierung des Attributs ist fehlerhaft definiert.Die zweite Implementierung ist einwandfrei.

Code

Imports System

Namespace DesignLibrary

' Violates rule: DefineAccessorsForAttributeArguments.
<AttributeUsage(AttributeTargets.All)>  _
NotInheritable Public Class BadCustomAttribute
    Inherits Attribute
    Private data As String 

    ' Missing the property that corresponds to  
    ' the someStringData parameter. 
    Public Sub New(someStringData As String)
        data = someStringData
    End Sub 'New 
End Class 'BadCustomAttribute

' Satisfies rule: Attributes should have accessors for all arguments.
<AttributeUsage(AttributeTargets.All)>  _
NotInheritable Public Class GoodCustomAttribute
    Inherits Attribute
    Private data As String 

    Public Sub New(someStringData As String)
        data = someStringData
    End Sub 'New 

    'The constructor parameter and property 
    'name are the same except for case. 

    Public ReadOnly Property SomeStringData() As String 
        Get 
            Return data
        End Get 
    End Property 
End Class  

End Namespace
using System;

namespace DesignLibrary
{
// Violates rule: DefineAccessorsForAttributeArguments.

   [AttributeUsage(AttributeTargets.All)]
   public sealed class BadCustomAttribute :Attribute 
   {
      string data;

      // Missing the property that corresponds to  
      // the someStringData parameter. 

      public BadCustomAttribute(string someStringData)
      {
         data = someStringData;
      }
   }

// Satisfies rule: Attributes should have accessors for all arguments.

   [AttributeUsage(AttributeTargets.All)]
   public sealed class GoodCustomAttribute :Attribute 
   {
      string data;

      public GoodCustomAttribute(string someStringData)
      {
         data = someStringData;
      }
      //The constructor parameter and property 
      //name are the same except for case. 

      public string SomeStringData
      {
         get 
         {
            return data;
         }
      }
   }
}

Positionsargumente und benannte Argumente

Beschreibung

Anhand von Positionsargumenten und benannten Argumenten wird Bibliotheksbenutzern verdeutlicht, welche Argumente für das Attribut zwingend und welche optional sind.

Im folgenden Beispiel wird eine Implementierung einen Attributs veranschaulicht, das sowohl über Positionsargumente als auch über benannte Argumente verfügt.

Code

using System; 

namespace DesignLibrary
{    
    [AttributeUsage(AttributeTargets.All)]        
    public sealed class GoodCustomAttribute : Attribute    
    {        
        string mandatory;        
        string optional;         

        public GoodCustomAttribute(string mandatoryData)        
        {            
            mandatory = mandatoryData;        
        }         

        public string MandatoryData        
        {            
            get { return mandatory; }        
        }         

        public string OptionalData        
        {            
            get { return optional; }            
            set { optional = value; }        
        }    
    }
}

Kommentare

Im folgenden Beispiel wird gezeigt, wie das benutzerdefinierte Attribut auf zwei Eigenschaften angewendet wird.

Code

[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string MyProperty
{
    get { return myProperty; }
    set { myProperty = value; }
}

[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string MyOtherProperty
{
    get { return myOtherProperty; }
    set { myOtherProperty = value; }
}

Verwandte Regeln

CA1813: Nicht versiegelte Attribute vermeiden

Siehe auch

Weitere Ressourcen

Attribute Usage Guidelines