CA1019: Definujte přístupové vlastnosti pro argumenty atributu
Vlastnost | Hodnota |
---|---|
ID pravidla | CA1019 |
Název | Definujte přístupové objekty pro argumenty atributů |
Kategorie | Návrh |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 8 | No |
Příčina
V jeho konstruktoru atribut definuje argumenty, které nemají odpovídající vlastnosti.
Popis pravidla
Atributy mohou definovat povinné argumenty, které musí být specifikovány při použití atributu na cíl. Říká se jim také poziční argumenty, jelikož jsou konstruktorům atributů předány jako poziční parametry. Pro každý povinný argument by měl atribut navíc poskytovat odpovídající vlastnost jen pro čtení, aby mohla být hodnota argumentu během spuštění získána. Toto pravidlo kontroluje, že pro každý parametr konstruktoru jste definovali odpovídající vlastnost.
Atributy mohou také definovat volitelné argumenty, které jsou rovněž známy jako pojmenované argumenty. Tyto argumenty jsou podle názvu poskytovány konstruktorům atributů a měly by mít odpovídající vlastnost pro čtení i zápis.
U povinných a volitelných argumentů by měly odpovídající vlastnosti a parametry konstruktoru používat stejný název, ale různá velikost velikostí. Vlastnosti používají casing pascalu a parametry používají camel casing.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, přidejte vlastnost jen pro čtení pro každý parametr konstruktoru, který ho nemá.
Kdy potlačit upozornění
Pokud nechcete, aby byla hodnota povinného argumentu načítaná, potlačit upozornění z tohoto pravidla.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA1019
// The code that's violating the rule is on this line.
#pragma warning restore CA1019
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA1019.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Příklady
Vlastní atributy
Následující příklad ukazuje dva atributy, které definují povinný (poziční) parametr. První implementace atributu je nesprávně definována. Druhá implementace je správná.
// 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
Poziční a pojmenované argumenty
Poziční a pojmenované argumenty usnadňují příjemcům knihovny, které argumenty jsou pro atribut povinné a které argumenty jsou volitelné.
Následující příklad ukazuje implementaci atributu, který má poziční i pojmenované argumenty:
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
public GoodCustomAttribute(string mandatoryData)
{
MandatoryData = mandatoryData;
}
public string MandatoryData { get; }
public string? OptionalData { get; set; }
}
Následující příklad ukazuje, jak použít vlastní atribut na dvě vlastnosti:
[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string? MyProperty { get; set; }
[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string? MyOtherProperty { get; set; }
Související pravidla
CA1813: Vyhněte se nezapečetěným atributům