CA1019: Accessoren für Attributargumente definieren.

Eigenschaft Wert
Regel-ID CA1019
Titel Accessoren für Attributargumente definieren.
Kategorie Design
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 9 aktiviert No

Ursache

Im Konstruktor eines Attributs werden die Argumente definiert, die keine entsprechenden Eigenschaften haben.

Regelbeschreibung

Attribute können obligatorische Argumente definieren, die angegeben werden müssen, wenn das Attribut auf ein Ziel angewendet wird. Diese Argumente werden auch als positionelle Argumente bezeichnet, da sie bei Attributkonstruktoren als positionelle Parameter angegeben werden. Für jedes obligatorische Argument muss das Attribut außerdem eine entsprechende schreibgeschützte Eigenschaft enthalten, damit der Wert des Arguments zur Ausführungszeit abgerufen werden kann. Diese Regel überprüft, ob Sie für jeden Parameter des Konstruktors die entsprechende Eigenschaft definiert haben.

Attribute können auch optionale Argumente definieren, die auch als benannte Argumente bezeichnet werden. Diese Argumente werden bei Attributkonstruktoren über ihren Namen angegeben und sollten über eine entsprechende Lese-Schreib-Eigenschaft verfügen.

Bei obligatorischen und optionalen Argumenten sollten Sie für die entsprechenden Eigenschaften und Konstruktorparameter zwar denselben Namen, aber eine unterschiedliche Groß-und Kleinschreibung verwenden. Bei Eigenschaften wird die Pascal-Schreibweise und bei Parametern die Camel-Case-Schreibweise verwendet.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, fügen Sie jedem Konstruktorparameter, der noch keine besitzt, eine schreibgeschützte Eigenschaft hinzu.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Warnung dieser Regel, wenn Sie nicht möchten, dass der Wert des obligatorischen Arguments abgerufen werden kann.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Beispiele

Benutzerdefinierte Attribute

Das folgende Beispiel zeigt zwei Attribute, die einen obligatorischen (positionellen) Parameter definieren. Die erste Implementierung des Attributs ist falsch definiert. Die zweite Implementierung ist 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

Positionelle und benannte Argumente

Mithilfe von positionellen und benannten Argumenten können Sie dem Consumer Ihrer Bibliothek deutlich machen, welche Argumente für das Attribut obligatorisch und welche optional sind.

Das folgende Beispiel zeigt die Implementierung eines Attributs mit sowohl positionellen als auch benannten Argumenten:

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

    public string MandatoryData { get; }

    public string? OptionalData { get; set; }
}

Im folgenden Beispiel wird gezeigt, wie das benutzerdefinierte Attribut auf zwei Eigenschaften angewendet werden kann:

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

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

CA1813: Nicht versiegelte Attribute vermeiden.

Siehe auch