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