Partager via


CA1019 : Définir des accesseurs pour les arguments d'attribut

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

Catégorie

Microsoft.CSharp

Modification avec rupture

Modification sans rupture

Cause

Dans son constructeur, un attribut définit des arguments qui n'ont pas de propriétés correspondantes.

Description de la règle

Les attributs peuvent définir des arguments obligatoires qui doivent être spécifiés lorsque vous appliquez l'attribut à une cible. Ceux-ci sont également appelés arguments positionnels parce qu'ils sont fournis aux constructeurs d'attributs en tant que paramètres positionnels. 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. Cette règle vérifie que, pour chaque paramètre de constructeur, vous avez défini la propriété correspondante.

Les attributs peuvent également définir des arguments facultatifs, qui sont également appelés arguments nommés. Ces arguments sont fournis aux constructeurs d'attributs par noms et doivent disposer d'une propriété en lecture/écriture correspondante.

Pour les arguments obligatoires et facultatifs, les propriétés correspondantes et les paramètres de constructeur doivent utiliser le même nom mais une casse différente. Les propriétés utilisent la casse Pascal et les paramètres la casse mixte.

Comment corriger les violations

Pour corriger une violation de cette règle, ajoutez une propriété en lecture seule pour chaque paramètre de constructeur qui en est dépourvu.

Quand supprimer les avertissements

Supprimez un avertissement de cette règle si vous ne souhaitez pas que la valeur de l'argument obligatoire soit récupérable.

Exemples d'attributs personnalisés

Description

L'exemple suivant présente deux attributs qui définissent un paramètre (positionnel) obligatoire. La définition de la première implémentation de l'attribut est incorrecte. La seconde implémentation est correcte.

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

Arguments positionnels et nommés

Description

Les arguments positionnels et nommés indiquent clairement aux consommateurs de votre bibliothèque les arguments qui sont obligatoires pour l'attribut et ceux qui sont facultatifs.

L'exemple suivant présente l'implémentation d'un attribut qui a des arguments positionnels et des arguments nommés.

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

Commentaires

L'exemple suivant indique comment appliquer l'attribut personnalisé à deux propriétés.

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

Règles connexes

CA1813 : Évitez les attributs unsealed

Voir aussi

Référence

Indications concernant l'utilisation des attributs