CA1018: Oznacz atrybuty AttributeUsageAttribute
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1018 |
Tytuł | Oznacz atrybuty atrybutem AttributeUsage |
Kategoria | Projekt |
Poprawka powodująca niezgodność lub niezgodność | Kluczowa |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
Atrybut System.AttributeUsageAttribute nie jest obecny w atrybucie niestandardowym.
Opis reguły
Podczas definiowania atrybutu niestandardowego oznacz go za pomocą polecenia AttributeUsageAttribute , aby wskazać, gdzie w kodzie źródłowym można zastosować atrybut niestandardowy. Znaczenie i zamierzone użycie atrybutu określi jego prawidłowe lokalizacje w kodzie. Można na przykład zdefiniować atrybut, który identyfikuje osobę, która jest odpowiedzialna za utrzymanie i ulepszanie każdego typu w bibliotece, a odpowiedzialność ta jest zawsze przypisywana na poziomie typu. W takim przypadku kompilatory powinny włączyć atrybut klas, wyliczenia i interfejsy, ale nie powinny włączać go w metodach, zdarzeniach lub właściwościach. Zasady i procedury organizacyjne określają, czy atrybut powinien być włączony w zestawach.
Wyliczenie System.AttributeTargets definiuje obiekty docelowe, które można określić dla atrybutu niestandardowego. Jeśli pominięto AttributeUsageAttribute, atrybut niestandardowy będzie prawidłowy dla wszystkich obiektów docelowych, zgodnie z definicją All
przez wartość AttributeTargets wyliczenia.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, określ elementy docelowe atrybutu przy użyciu polecenia AttributeUsageAttribute. Zobacz poniższy przykład.
Kiedy pomijać ostrzeżenia
Należy naprawić naruszenie tej reguły zamiast wykluczać komunikat. Nawet jeśli atrybut dziedziczy AttributeUsageAttribute, atrybut powinien być obecny, aby uprościć konserwację kodu.
Przykład
W poniższym przykładzie zdefiniowano dwa atrybuty. BadCodeMaintainerAttribute
niepoprawnie pomija instrukcję AttributeUsageAttribute i GoodCodeMaintainerAttribute
poprawnie implementuje atrybut opisany wcześniej w tej sekcji. (Właściwość DeveloperName
jest wymagana przez regułę projektowania CA1019: Zdefiniuj metody dostępu dla argumentów atrybutów i jest dołączana do kompletności).
using System;
namespace ca1018
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute : Attribute
{
public BadCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
// Satisfies rule: Attributes specify AttributeUsage.
// This attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute : Attribute
{
public GoodCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
}
Imports System
Namespace ca1018
' Violates rule: MarkAttributesWithAttributeUsage.
Public NotInheritable Class BadCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
End Class
' Satisfies rule: Attributes specify AttributeUsage.
' The attribute is valid for type-level targets.
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Enum Or
AttributeTargets.Interface Or AttributeTargets.Delegate)>
Public NotInheritable Class GoodCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
End Class
End Namespace
Powiązane reguły
- CA1019: Zdefiniuj metody dostępu dla argumentów atrybutu
- CA1813: Unikaj niezapieczętowanych atrybutów