Delen via


CA1018: Kenmerken markeren met AttributeUsageAttribute

Eigenschappen Weergegeven als
Regel-id CA1018
Titel Kenmerken markeren met AttributeUsageAttribute
Categorie Ontwerpen
Oplossing is brekend of niet-brekend Breken
Standaard ingeschakeld in .NET 8 Als suggestie

Oorzaak

Het System.AttributeUsageAttribute kenmerk is niet aanwezig in het aangepaste kenmerk.

Beschrijving van regel

Wanneer u een aangepast kenmerk definieert, markeert u het met behulp van het kenmerk AttributeUsageAttribute om aan te geven waar in de broncode het aangepaste kenmerk kan worden toegepast. De betekenis en het beoogde gebruik van een kenmerk bepalen de geldige locaties in code. U kunt bijvoorbeeld een kenmerk definiëren dat de persoon identificeert die verantwoordelijk is voor het onderhouden en verbeteren van elk type in een bibliotheek en die verantwoordelijkheid altijd op typeniveau wordt toegewezen. In dit geval moeten compilers het kenmerk inschakelen voor klassen, opsommingen en interfaces, maar moeten ze deze niet inschakelen voor methoden, gebeurtenissen of eigenschappen. Organisatiebeleid en -procedures bepalen of het kenmerk moet worden ingeschakeld voor assembly's.

De System.AttributeTargets opsomming definieert de doelen die u kunt opgeven voor een aangepast kenmerk. Als u weglaat AttributeUsageAttribute, is uw aangepaste kenmerk geldig voor alle doelen, zoals gedefinieerd door de All waarde van AttributeTargets opsomming.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, geeft u doelen voor het kenmerk op met behulp van AttributeUsageAttribute. Zie het volgende voorbeeld.

Wanneer waarschuwingen onderdrukken

U moet een schending van deze regel oplossen in plaats van het bericht uit te sluiten. Zelfs als het kenmerk wordt overgenomen AttributeUsageAttribute, moet het kenmerk aanwezig zijn om het onderhoud van code te vereenvoudigen.

Opmerking

In het volgende voorbeeld worden twee kenmerken gedefinieerd. BadCodeMaintainerAttribute hiermee wordt de AttributeUsageAttribute instructie onjuist weggelaten en GoodCodeMaintainerAttribute wordt het kenmerk dat eerder in deze sectie wordt beschreven, correct geïmplementeerd. (De eigenschap DeveloperName is vereist voor de ontwerpregel CA1019: Accessors definiëren voor kenmerkargumenten en is opgenomen voor volledigheid.)

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

Zie ook