Delen via


CA1019: Accessors definiëren voor kenmerkargumenten

Eigenschappen Weergegeven als
Regel-id CA1019
Titel Accessors definiëren voor kenmerkargumenten
Categorie Ontwerpen
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Nee

Oorzaak

In de constructor definieert een kenmerk argumenten die geen bijbehorende eigenschappen hebben.

Beschrijving van regel

Kenmerken kunnen verplichte argumenten definiëren die moeten worden opgegeven wanneer u het kenmerk toepast op een doel. Deze worden ook wel positionele argumenten genoemd, omdat ze worden geleverd aan kenmerkconstructors als positionele parameters. Voor elk verplicht argument moet het kenmerk ook een bijbehorende alleen-lezen-eigenschap opgeven, zodat de waarde van het argument tijdens de uitvoering kan worden opgehaald. Met deze regel wordt gecontroleerd of u voor elke constructorparameter de bijbehorende eigenschap hebt gedefinieerd.

Kenmerken kunnen ook optionele argumenten definiëren, die ook wel benoemde argumenten worden genoemd. Deze argumenten worden op naam opgegeven voor kenmerkconstructors en moeten een bijbehorende eigenschap lezen/schrijven hebben.

Voor verplichte en optionele argumenten moeten de bijbehorende eigenschappen en constructorparameters dezelfde naam maar verschillende hoofdletters gebruiken. Eigenschappen gebruiken Pascal-behuizing en parameters maken gebruik van kameelbehuizing.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, voegt u een alleen-lezen eigenschap toe voor elke constructorparameter die er geen heeft.

Wanneer waarschuwingen onderdrukken

Onderdrukt een waarschuwing van deze regel als u niet wilt dat de waarde van het verplichte argument kan worden opgehaald.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Voorbeelden

Aangepaste kenmerken

In het volgende voorbeeld ziet u twee kenmerken waarmee een verplichte (positionele) parameter wordt gedefinieerd. De eerste implementatie van het kenmerk is onjuist gedefinieerd. De tweede implementatie is juist.

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

Positionele en benoemde argumenten

Positionele en benoemde argumenten maken het duidelijk voor consumenten van uw bibliotheek welke argumenten verplicht zijn voor het kenmerk en welke argumenten optioneel zijn.

In het volgende voorbeeld ziet u een implementatie van een kenmerk met zowel positionele als benoemde argumenten:

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

    public string MandatoryData { get; }

    public string? OptionalData { get; set; }
}

In het volgende voorbeeld ziet u hoe u het aangepaste kenmerk toepast op twee eigenschappen:

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

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

CA1813: Niet-verzegelde kenmerken voorkomen

Zie ook