Dela via


CA1019: Definiera accessorer för attributargument

Property Värde
Regel-ID CA1019
Title Definiera accessorer för attributargument
Kategori Designa
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 9 Nej

Orsak

I konstruktorn definierar ett attribut argument som inte har motsvarande egenskaper.

Regelbeskrivning

Attribut kan definiera obligatoriska argument som måste anges när du tillämpar attributet på ett mål. Dessa kallas även för positionsargument eftersom de tillhandahålls till attributkonstruktorer som positionsparametrar. För varje obligatoriskt argument bör attributet också tillhandahålla en motsvarande skrivskyddad egenskap så att argumentets värde kan hämtas vid körningen. Den här regeln kontrollerar att för varje konstruktorparameter har du definierat motsvarande egenskap.

Attribut kan också definiera valfria argument, som även kallas namngivna argument. Dessa argument tillhandahålls till attributkonstruktorer efter namn och bör ha en motsvarande läs-/skrivegenskap.

För obligatoriska och valfria argument bör motsvarande egenskaper och konstruktorparametrar använda samma namn men olika höljen. Egenskaper använder Pascal-hölje och parametrar använder kamelhölje.

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln lägger du till en skrivskyddad egenskap för varje konstruktorparameter som inte har någon.

När du ska ignorera varningar

Ignorera en varning från den här regeln om du inte vill att värdet för det obligatoriska argumentet ska kunna hämtas.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel

Anpassade attribut

I följande exempel visas två attribut som definierar en obligatorisk parameter (positionell). Den första implementeringen av attributet är felaktigt definierad. Den andra implementeringen är korrekt.

// 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

Positionella och namngivna argument

Positionella och namngivna argument gör det tydligt för bibliotekskonsumenterna vilka argument som är obligatoriska för attributet och vilka argument som är valfria.

I följande exempel visas en implementering av ett attribut som har både positionella och namngivna argument:

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

    public string MandatoryData { get; }

    public string? OptionalData { get; set; }
}

I följande exempel visas hur du tillämpar det anpassade attributet på två egenskaper:

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

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

CA1813: Undvik oförseglade attribut

Se även