Dela via


CA1018: Markera attribut med AttributeUsageAttribute

Property Värde
Regel-ID CA1018
Title Markera attribut med AttributeUsageAttribute
Kategori Designa
Korrigeringen är icke-bakåtkompatibel Brott
Aktiverad som standard i .NET 9 Som förslag

Orsak

Attributet System.AttributeUsageAttribute finns inte i det anpassade attributet.

Regelbeskrivning

När du definierar ett anpassat attribut markerar du det med hjälp AttributeUsageAttribute av för att ange var i källkoden det anpassade attributet kan tillämpas. Innebörden och den avsedda användningen av ett attribut avgör dess giltiga platser i koden. Du kan till exempel definiera ett attribut som identifierar den person som ansvarar för att underhålla och förbättra varje typ i ett bibliotek, och det ansvaret tilldelas alltid på typnivå. I det här fallet bör kompilatorer aktivera attributet för klasser, uppräkningar och gränssnitt, men bör inte aktivera det på metoder, händelser eller egenskaper. Organisationsprinciper och procedurer avgör om attributet ska aktiveras i sammansättningar.

Uppräkningen System.AttributeTargets definierar de mål som du kan ange för ett anpassat attribut. Om du utelämnar AttributeUsageAttributekommer ditt anpassade attribut att vara giltigt för alla mål, enligt All uppräkningsvärdet AttributeTargets .

Så här åtgärdar du överträdelser

Om du vill åtgärda en överträdelse av den här regeln anger du mål för attributet med hjälp AttributeUsageAttributeav . Se följande exempel.

När du ska ignorera varningar

Du bör åtgärda ett brott mot den här regeln i stället för att exkludera meddelandet. Även om attributet ärver AttributeUsageAttributebör attributet finnas för att förenkla kodunderhållet.

Exempel

I följande exempel definieras två attribut. BadCodeMaintainerAttribute utelämnar instruktionen AttributeUsageAttribute felaktigt och GoodCodeMaintainerAttribute implementerar på rätt sätt det attribut som beskrivs tidigare i det här avsnittet. (Egenskapen DeveloperName krävs av designregeln CA1019: Definiera accessorer för attributargument och inkluderas för fullständighet.)

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

Se även