CA1018: Oznacz atrybuty AttributeUsageAttribute
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
Kategoria |
Microsoft.Design |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Atrybut AttributeUsageAttribute nie jest obecny na niestandardowym atrybucie.
Opis reguły
Definiując atrybut niestandardowy, oznacz go za pomocą AttributeUsageAttribute, aby wskazać, gdzie w kodzie źródłowym atrybut niestandardowy może zostać zastosowany.Znaczenie i zamierzone użycie atrybutu określi jego prawidłowe lokalizacje w kodzie.Na przykład, można zdefiniować atrybut, który identyfikuje osobę odpowiedzialną za konserwację i ulepszanie każdego typu w bibliotece, ta odpowiedzialność jest zawsze przypisywana na poziomie typu.W takim przypadku kompilatory powinny włączyć ten atrybut w klasach, wyliczeniach i interfejsach, ale nie powinny włączać go w metodach, zdarzeniach i właściwościach.Zasady i procedury organizacyjne określają, czy atrybut powinien być włączony dla zestawów.
Enumeracja AttributeTargets określa cele, które można określić dla atrybutu niestandardowego.Jeżeli pominięto AttributeUsageAttribute, niestandardowy atrybut będzie ważny dla wszystkich celów, wyznaczony przez wartość All wyliczenia AttributeTargets.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, określ cele dla atrybutu używając AttributeUsageAttribute.Zobacz przykład poniżej.
Kiedy pominąć ostrzeżenia
Należy naprawić naruszenie tej reguły, zamiast wyłączyć wiadomość.Nawet jeśli atrybut dziedziczy z AttributeUsageAttribute, atrybut powinien być obecny, aby ułatwić konserwację kodu.
Przykład
W poniższym przykładzie zdefiniowano dwa atrybuty.BadCodeMaintainerAttribute niepoprawnie pomija instrukcję AttributeUsageAttribute, a GoodCodeMaintainerAttribute poprawnie implementuje atrybut, który został opisany w tej sekcji.Należy zauważyć, że właściwość DeveloperName jest wymagana przez regułę projektowania CA1019: Zdefiniuj metody dostępu do argumentów atrybutu i jest uwzględniona dla kompletności.
Imports System
Namespace DesignLibrary
' Violates rule: MarkAttributesWithAttributeUsage.
NotInheritable Public Class BadCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
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)> _
NotInheritable Public Class GoodCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
End Class
End Namespace
using System;
namespace DesignLibrary
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute :Attribute
{
string developer;
public BadCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
// Satisfies rule: Attributes specify AttributeUsage.
// The attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute :Attribute
{
string developer;
public GoodCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
}
Powiązane reguły
CA1019: Zdefiniuj metody dostępu do argumentów atrybutu
CA1813: Unikaj niezapieczętowanych atrybutów