CA1019 : Définir des accesseurs pour les arguments d'attributCA1019: Define accessors for attribute arguments

TypeNameTypeName DefineAccessorsForAttributeArgumentsDefineAccessorsForAttributeArguments
CheckIdCheckId CA1019CA1019
CategoryCategory Microsoft.DesignMicrosoft.Design
Modification avec ruptureBreaking Change Sans ruptureNon-breaking

CauseCause

Dans son constructeur, un attribut définit des arguments qui n’ont pas de propriétés correspondantes.In its constructor, an attribute defines arguments that do not have corresponding properties.

Description de la règleRule Description

Les attributs peuvent définir des arguments obligatoires qui doivent être spécifiés lorsque vous appliquez l’attribut à une cible.Attributes can define mandatory arguments that must be specified when you apply the attribute to a target. Ceux-ci sont également appelés arguments positionnels parce qu’ils sont fournis aux constructeurs d’attributs en tant que paramètres positionnels.These are also known as positional arguments because they are supplied to attribute constructors as positional parameters. Pour chaque argument obligatoire, l’attribut doit également fournir une propriété en lecture seule correspondante afin que la valeur de l’argument puisse être récupérée au moment de l’exécution.For every mandatory argument, the attribute should also provide a corresponding read-only property so that the value of the argument can be retrieved at execution time. Cette règle vérifie que, pour chaque paramètre de constructeur, vous avez défini la propriété correspondante.This rule checks that for each constructor parameter, you have defined the corresponding property.

Les attributs peuvent également définir des arguments facultatifs, qui sont également appelés arguments nommés.Attributes can also define optional arguments, which are also known as named arguments. Ces arguments sont fournis aux constructeurs d'attributs par noms et doivent disposer d'une propriété en lecture/écriture correspondante.These arguments are supplied to attribute constructors by name and should have a corresponding read/write property.

Pour les arguments obligatoires et facultatifs, les propriétés correspondantes et les paramètres du constructeur doivent utiliser le même nom mais une casse différente.For mandatory and optional arguments, the corresponding properties and constructor parameters should use the same name but different casing. Propriétés utilisent la casse Pascal casse et les paramètres la casse.Properties use Pascal casing, and parameters use camel casing.

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, ajoutez une propriété en lecture seule pour chaque paramètre de constructeur qui n’en a pas.To fix a violation of this rule, add a read-only property for each constructor parameter that does not have one.

Quand supprimer les avertissementsWhen to Suppress Warnings

Supprimer un avertissement de cette règle si vous ne souhaitez pas la valeur de l’argument obligatoire soit récupérable.Suppress a warning from this rule if you do not want the value of the mandatory argument to be retrievable.

Exemples d’attributs personnalisésCustom Attributes Example

DescriptionDescription

L’exemple suivant montre deux attributs qui définissent un paramètre (positionnel) obligatoire.The following example shows two attributes that define a mandatory (positional) parameter. La première implémentation de l’attribut est définie incorrectement.The first implementation of the attribute is incorrectly defined. La seconde implémentation est correcte.The second implementation is correct.

CodeCode

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;
         }
      }
   }
}
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

Arguments nommés et positionnelsPositional and Named Arguments

DescriptionDescription

Arguments nommés et positionnels rendre clairement aux consommateurs de votre bibliothèque les arguments qui sont obligatoires pour l’attribut et les arguments sont facultatifs.Positional and named arguments make to clear to consumers of your library which arguments are mandatory for the attribute and which arguments are optional.

L’exemple suivant illustre une implémentation d’un attribut qui comporte des arguments nommés et positionnels.The following example shows an implementation of an attribute that has both positional and named arguments.

CodeCode

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; }        
        }    
    }
}

CommentairesComments

L’exemple suivant montre comment appliquer l’attribut personnalisé à deux propriétés.The following example shows how to apply the custom attribute to two properties.

CodeCode

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

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

CA1813 : Évitez les attributs unsealedCA1813: Avoid unsealed attributes

Voir aussiSee Also

AttributsAttributes