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; }
Relaterade regler
CA1813: Undvik oförseglade attribut