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

Właściwości Wartość
Identyfikator reguły CA1019
Stanowisko Zdefiniuj metody dostępu dla argumentów atrybutów
Kategoria Projekt
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

W konstruktorze atrybut definiuje argumenty, które nie mają odpowiednich właściwości.

Opis reguły

Atrybuty mogą definiować obowiązkowe argumenty, które trzeba określić, aby móc 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 odpowiednią właściwość.

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

W przypadku obowiązkowych i opcjonalnych argumentów odpowiednie właściwości i parametry konstruktora powinny używać tej samej nazwy, ale innej wielkości liter. Właściwości używają wielkości liter Pascal, a parametry używają wielkości liter wielbłąda.

Jak naprawić naruszenia

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

Kiedy pomijać ostrzeżenia

Pomiń ostrzeżenie z tej reguły, jeśli nie chcesz, aby wartość obowiązkowego argumentu można było pobrać.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA1019
// The code that's violating the rule is on this line.
#pragma warning restore CA1019

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA1019.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady

Atrybuty niestandardowe

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

// Violates rule: DefineAccessorsForAttributeArguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class BadCustomAttribute : Attribute
{
    string _data;

    // Missing the property that corresponds to 
    // the someStringData constructor parameter.

    public BadCustomAttribute(string someStringData)
    {
        _data = someStringData;
    }
}

// Satisfies rule: Attributes should have accessors for all arguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
    public GoodCustomAttribute(string someStringData)
    {
        SomeStringData = someStringData;
    }

    //The constructor parameter and property
    //name are the same except for case.

    public string SomeStringData { get; }
}
Imports System

Namespace ca1019

    ' Violates rule: DefineAccessorsForAttributeArguments.
    <AttributeUsage(AttributeTargets.All)>
    Public NotInheritable 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)>
    Public NotInheritable Class GoodCustomAttribute
        Inherits Attribute

        Public Sub New(someStringData As String)
            Me.SomeStringData = someStringData
        End Sub 'New

        'The constructor parameter and property
        'name are the same except for case.

        Public ReadOnly Property SomeStringData() As String
    End Class

End Namespace

Argumenty pozycyjne i nazwane

Argumenty pozycyjne i nazwane są jasne dla użytkowników biblioteki, które argumenty są obowiązkowe dla atrybutu i które argumenty są opcjonalne.

W poniższym przykładzie pokazano implementację atrybutu, który ma zarówno argumenty pozycyjne, jak i nazwane:

[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
    public GoodCustomAttribute(string mandatoryData)
    {
        MandatoryData = mandatoryData;
    }

    public string MandatoryData { get; }

    public string? OptionalData { get; set; }
}

W poniższym przykładzie pokazano, jak zastosować atrybut niestandardowy do dwóch właściwości:

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

[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string? MyOtherProperty { get; set; }

CA1813: Unikaj niezapieczętowanych atrybutów

Zobacz też