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 8 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

Viz také