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