Compartilhar via


CA1019: Definir acessadores para argumentos de atributo

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Não-separável

Causa

Em seu construtor, um atributo define argumentos que não possuem propriedades correspondentes.

Descrição da regra

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

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

Para argumentos obrigatórios e opcionais, as propriedades correspondentes e os parâmetros do construtor devem usar o mesmo nome mas maiúsculas de minúsculas.Propriedades Pascal de usar maiúsculas e minúsculas e maiúsculas e minúsculas camel do uso de parâmetros.

Como corrigir violações

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

Quando suprimir avisos

Se você não quiser que o valor do argumento obrigatório para ser recuperável, suprimir um aviso da regra.

Exemplo de atributos personalizados

ms182136.collapse_all(pt-br,VS.110).gifDescrição

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

ms182136.collapse_all(pt-br,VS.110).gifCó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;
         }
      }
   }
}

Argumentos posicionais e nomeados

ms182136.collapse_all(pt-br,VS.110).gifDescrição

Argumentos posicionais e nomeados fazer para limpar a consumidores da sua biblioteca, quais argumentos são obrigatórios para o atributo e quais argumentos são opcionais.

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

ms182136.collapse_all(pt-br,VS.110).gifCó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; }        
        }    
    }
}

ms182136.collapse_all(pt-br,VS.110).gifComentários

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

ms182136.collapse_all(pt-br,VS.110).gifCó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: Evite atributos sem lacre

Consulte também

Referência

Attribute Usage Guidelines