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; }
Ähnliche Regeln
CA1813: Nicht versiegelte Attribute vermeiden.