Sdílet prostřednictvím


CA1019: Definujte přístupové vlastnosti pro argumenty atributu

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

Kategorie

Microsoft.Design

Narušující změna

Nenarušující

Příčina

Konstruktor atributu definuje argumenty, které nemají odpovídající vlastnosti.

Popis pravidla

Atributy mohou definovat povinné argumenty, které musejí být specifikovány při použití atributu na cíl.Říká se jim také poziční argumenty, jelikož jsou konstruktorům atributů předány jako poziční parametry.Pro každý povinný argument by měl atribut navíc poskytovat odpovídající vlastnost jen pro čtení, aby mohla být hodnota argumentu během spuštění získána.Toto pravidlo kontroluje, zda je pro každý parametr konstruktoru definována odpovídající vlastnost.

Atributy mohou také definovat volitelné argumenty, které jsou rovněž známy jako pojmenované argumenty.Tyto argumenty jsou podle názvu poskytovány konstruktorům atributů a měly by mít odpovídající vlastnost pro čtení i zápis.

U povinných a volitelných argumentů by měly odpovídající vlastnosti a parametry konstruktoru používat stejný název, ale rozdílnou notaci.U vlastností se používá Pascalova notace a u parametrů se používá velbloudí notace.

Jak vyřešit porušení

Pro odstranění porušení tohoto pravidla je potřeba přidat vlastnost pouze pro čtení pro každý parametr konstruktoru, který ji nemá.

Kdy potlačit upozornění

Upozornění lze u tohoto pravidla potlačit, jestliže není nutné, aby bylo možné hodnotu argumentu získat.

Příklad vlastního atributu

Popis

Následující příklad ukazuje dva atributy, které definují povinný (poziční) parametr.První implementace atributu není korektně definována.Druhá implementace je správně.

Kód

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

Poziční a pojmenované argumenty

Description

Poziční a pojmenované argumenty ujišťují spotřebitele knihovny v tom, které argumenty jsou pro atribut povinné a které jsou volitelné.

Následující příklad ukazuje implementaci atributu, který má poziční i pojmenované argumenty.

Kód

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

Komentáře

Následující příklad ukazuje použití vlastního atributu na dvě vlastnosti.

Kód

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

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

Související pravidla

CA1813: Vyhněte se nezapečetěným atributům

Viz také

Další zdroje

Attribute Usage Guidelines