Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA1018 |
| Titel | Kenmerken markeren met AttributeUsageAttribute |
| Categorie | Ontwerpen |
| Fix kan brekend of niet-brekend zijn | Onderbreking |
| Standaard ingeschakeld in .NET 10 | Als suggestie |
| Toepasselijke talen | C# en Visual Basic |
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. Het beleid en de procedures van de organisatie bepalen of het kenmerk moet worden ingeschakeld voor samenstellingen.
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.
Hoe schendingen op te lossen
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.
Voorbeeld
In het volgende voorbeeld worden twee kenmerken gedefinieerd.
BadCodeMaintainerAttribute laat ten onrechte de AttributeUsageAttribute instructie weg, en GoodCodeMaintainerAttribute implementeert correct het kenmerk dat eerder in deze sectie wordt beschreven. (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