Sdílet prostřednictvím


CA1018: Označte atributy pomocí AttributeUsageAttribute

Vlastnost Hodnota
ID pravidla CA1018
Název Označte atributy pomocí AttributeUsageAttribute
Kategorie Návrh
Oprava, která může být destruktivní nebo nedestruktivní Přerušující
Povoleno ve výchozím nastavení v .NET 10 Jako návrh
Příslušné jazyky C# a Visual Basic

Příčina

Atribut System.AttributeUsageAttribute není k dispozici u vlastního atributu.

Popis pravidla

Když definujete vlastní atribut, označte místo ve zdrojovém kódu, kde jej lze použít, pomocí AttributeUsageAttribute. 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áno hodnotou výčtu AllAttributeTargets.

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é