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