Udostępnij za pośrednictwem


CA1019: Zdefiniuj metody dostępu do argumentów atrybutu

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

Kategoria

Microsoft.Design

Zmiana kluczowa

Niekluczowa

Przyczyna

We własnym konstruktorze, atrybut określa argumenty które nie posiadają odpowiadających właściwości.

Opis reguły

Atrybuty mogą definiować obowiązkowe argumenty, które muszą zostać określone, aby zastosować atrybut do obiektu docelowego.Znane są również jako argumenty pozycyjne, ponieważ są one dostarczane do konstruktorów atrybutu jako parametry pozycyjne.Dla każdego obowiązkowego argumentu atrybut powinien również dostarczyć odpowiadającą właściwość tylko do odczytu, dzięki której można pobrać wartość argumentu w czasie wykonywania.Ta reguła sprawdza, czy dla każdego parametru konstruktora zdefiniowano odpowiadającą właściwość.

Atrybuty mogą także definiować argumenty opcjonalne, które są również znane jako argumenty nazwane.Te argumenty są dostarczane do konstruktorów atrybutu poprzez nazwę i powinny posiadać odpowiadającą właściwość umożliwiającą odczyt i zapis.

Dla obowiązkowych i opcjonalnych argumentów, odpowiadające właściwości i parametry konstruktora powinny używać takich samych nazw, ale różnych wielkości liter.Właściwości używają PascalCase, a parametry CamelCase.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, dodaj właściwość tylko do odczytu dla każdego parametru konstruktora, który jej nie ma.

Kiedy pominąć ostrzeżenia

Ostrzeżenie od tej reguły można pominąć, jeśli nie chcesz, aby wartość obowiązkowego argumentu można było odzyskać.

Przykład atrybutów niestandardowych

Opis

W poniższym przykładzie przedstawiono dwa atrybuty definiujące obowiązkowy parametr (pozycyjny).Pierwsza implementacja atrybutu jest niepoprawnie zdefiniowana.Druga implementacja jest poprawna.

Kod

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

Argumenty nazwane i pozycyjne

Opis

Argumenty pozycyjne i nazwane wyjaśniają użytkownikom twojej biblioteki, które argumenty są obowiązkowe dla atrybutu, a które opcjonalne.

Poniższy przykład pokazuje implementację atrybutu, który posiada zarówno pozycyjne jak i nazwane argumenty.

Kod

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

Komentarze

Poniższy przykład pokazuje jak zastosować własny atrybut do dwóch właściwości.

Kod

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

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

Powiązane reguły

CA1813: Unikaj niezapieczętowanych atrybutów

Zobacz też

Inne zasoby

Attribute Usage Guidelines