CA1018: Označte atributy pomocí AttributeUsageAttribute
Vlastnost | Hodnota |
---|---|
ID pravidla | CA1018 |
Název | Označte atributy pomocí AttributeUsageAttribute |
Kategorie | Návrh |
Oprava způsobující chybu nebo chybu způsobující chybu | Narušující |
Povoleno ve výchozím nastavení v .NET 9 | Jako návrh |
Příčina
Atribut System.AttributeUsageAttribute není k dispozici u vlastního atributu.
Popis pravidla
Když definujete vlastní atribut, označte ho pomocí označující AttributeUsageAttribute , kde se ve zdrojovém kódu dá použít vlastní atribut. Význam a zamýšlené použití atributu určuje jeho platné umístění v kódu. Můžete například definovat atribut, který identifikuje osobu odpovědnou za údržbu a vylepšení každého typu v knihovně a tato odpovědnost je vždy přiřazena na úrovni typu. V tomto případě by kompilátory měly povolit atribut u tříd, výčtů a rozhraní, ale neměly by jej povolit pro metody, události nebo vlastnosti. Zásady a postupy organizace určují, jestli má být atribut povolen pro sestavení.
Výčet System.AttributeTargets definuje cíle, které můžete zadat pro vlastní atribut. Pokud vynecháte AttributeUsageAttribute, bude váš vlastní atribut platný pro všechny cíle, jak je definována All
hodnotou výčtu AttributeTargets .
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, zadejte cíle pro atribut pomocí .AttributeUsageAttribute Viz následující příklad.
Kdy potlačit upozornění
Místo vyloučení zprávy byste měli opravit porušení tohoto pravidla. I když atribut dědí AttributeUsageAttribute, atribut by měl být k dispozici pro zjednodušení údržby kódu.
Příklad
Následující příklad definuje dva atributy. BadCodeMaintainerAttribute
nesprávně vynechá AttributeUsageAttribute příkaz a GoodCodeMaintainerAttribute
správně implementuje atribut, který je popsán výše v této části. (Vlastnost DeveloperName
je vyžadována pravidlem návrhu CA1019: Definovat přístupové objekty pro argumenty atributů a je zahrnuta pro úplnost.)
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
Související pravidla
- CA1019: Definujte přístupové objekty pro argumenty atributu
- CA1813: Vyhněte se nezapečetěným atributům