Compartilhar via


CA1019: definir acessadores para argumentos de atributo

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

Categoria

Microsoft.Design

Alteração Significativa

Sem quebra

Causa

No construtor, um atributo define os argumentos que não têm propriedades correspondentes.

Descrição da Regra

Os atributos podem definir argumentos obrigatórios que devem ser especificados quando você aplicar o atributo a um destino.Eles também são conhecidos como argumentos posicionais porque são fornecidas para atribuir construtores como parâmetros posicionais.Para cada argumento obrigatório, o atributo deve fornecer uma propriedade somente leitura correspondente de forma que o valor do argumento pode ser recuperado em tempo de execução.Esta regra verifica o que para cada parâmetro do construtor, você definiu a propriedade correspondente.

Os atributos também podem definir argumentos opcionais, que também são conhecidos como argumentos nomeados.Esses argumentos são fornecidos para atribuir por nome construtores e devem ter uma propriedade de leitura/gravação correspondente.

Para argumentos obrigatórios e opcionais, as propriedades e os parâmetros correspondentes do devem usar o mesmo nome mas a diferença em.O uso de maiúsculas e minúsculas de Pascal de uso de propriedades, e os parâmetros usam as caixas de camelo.

Como Corrigir Violações

Para corrigir uma violação desta regra, adicione uma propriedade somente leitura para cada parâmetro do construtor que não tem um.

Quando Suprimir Alertas

Suprima um aviso dessa regra se não quiser que o valor do argumento obrigatório para ser recuperável.

Exemplo de atributos personalizados

Descrição

O exemplo a seguir mostra dois atributos que definem um parâmetro posicional (obrigatório).A primeira implementação do atributo for definida incorretamente.A segunda implementação está correta.

Código

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

Argumento posicional e nomeado

Descrição

Os argumentos posicionais e nomeadas fazem para limpar para consumidores da biblioteca que os argumentos são obrigatórios para o atributo e os argumentos que são opcionais.

O exemplo a seguir mostra uma implementação de um atributo que tem argumentos posicionais e nomeadas.

Código

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

Comentários

O exemplo a seguir mostra como aplicar o atributo personalizado a duas propriedades.

Código

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

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

Regras Relacionadas

CA1813: evitar atributos não lacrados

Consulte também

Outros recursos

Attribute Usage Guidelines