CA1019: Zdefiniuj metody dostępu do argumentów atrybutu
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1019 |
Tytuł | Zdefiniuj metody dostępu dla argumentów atrybutów |
Kategoria | Projekt |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
W konstruktorze atrybut definiuje argumenty, które nie mają odpowiednich właściwości.
Opis reguły
Atrybuty mogą definiować obowiązkowe argumenty, które trzeba określić, aby móc zastosować atrybut do obiektu docelowego. Znane są również jako argumenty pozycyjne, ponieważ są one dostarczane do konstruktorów atrybutu jako parametry pozycyjne. Dla każdego obowiązkowego argumentu atrybut powinien również dostarczyć odpowiadającą właściwość tylko do odczytu, dzięki której można pobrać wartość argumentu w czasie wykonywania. Ta reguła sprawdza, czy dla każdego parametru konstruktora zdefiniowano odpowiednią właściwość.
Atrybuty mogą też definiować argumenty opcjonalne, które są znane również jako argumenty nazwane. Argumenty te są dostarczane do konstruktorów atrybutu poprzez nazwę i powinny mieć odpowiadającą właściwość umożliwiającą odczyt i zapis.
W przypadku obowiązkowych i opcjonalnych argumentów odpowiednie właściwości i parametry konstruktora powinny używać tej samej nazwy, ale innej wielkości liter. Właściwości używają wielkości liter Pascal, a parametry używają wielkości liter wielbłąda.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, dodaj właściwość tylko do odczytu dla każdego parametru konstruktora, który nie ma go.
Kiedy pomijać ostrzeżenia
Pomiń ostrzeżenie z tej reguły, jeśli nie chcesz, aby wartość obowiązkowego argumentu można było pobrać.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1019
// The code that's violating the rule is on this line.
#pragma warning restore CA1019
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1019.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykłady
Atrybuty niestandardowe
W poniższym przykładzie przedstawiono dwa atrybuty, które definiują obowiązkowy (pozycyjny) parametr. Pierwsza implementacja atrybutu jest niepoprawnie zdefiniowana. Druga implementacja jest poprawna.
// 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
Argumenty pozycyjne i nazwane
Argumenty pozycyjne i nazwane są jasne dla użytkowników biblioteki, które argumenty są obowiązkowe dla atrybutu i które argumenty są opcjonalne.
W poniższym przykładzie pokazano implementację atrybutu, który ma zarówno argumenty pozycyjne, jak i nazwane:
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
public GoodCustomAttribute(string mandatoryData)
{
MandatoryData = mandatoryData;
}
public string MandatoryData { get; }
public string? OptionalData { get; set; }
}
W poniższym przykładzie pokazano, jak zastosować atrybut niestandardowy do dwóch właściwości:
[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string? MyProperty { get; set; }
[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string? MyOtherProperty { get; set; }
Powiązane reguły
CA1813: Unikaj niezapieczętowanych atrybutów