CA1018: Označte atributy pomocí AttributeUsageAttribute
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
Kategorie |
Microsoft.Design |
Narušující změna |
Narušující |
Příčina
Atribut AttributeUsageAttribute není k dispozici na vlastním atributu.
Popis pravidla
Při definování vlastního atributu jej označte pomocí AttributeUsageAttribute k indikaci toho, kde ve zdrojovém kódu lze vlastní atribut použít.Význam a zamýšlené použití atributu určuje jeho platné umístění v kódu.Lze například definovat atribut identifikující osobu, která je zodpovědná za udržování a zlepšování každého typu v knihovně a tato odpovědnost je vždy přiřazena na úrovni typu.V tomto případě by měly kompilátory povolit atribut na třídách, vyčíslení a rozhraní, ale neměly by jej povolit na metodách, událostech nebo vlastnostech.Organizační zásady a postupy by určovaly, zda má být atribut povolen na sestaveních.
Výčet AttributeTargets definuje cíle, které lze zadat pro vlastní atribut.Vynecháte-li AttributeUsageAttribute, vlastní atribut bude platit pro všechny cíle definované hodnotou All výčtu AttributeTargets.
Jak vyřešit porušení
Pro nápravu porušení tohoto pravidla zadejte cíle pro atribut pomocí AttributeUsageAttribute.Viz následující příklad.
Kdy potlačit upozornění
Namísto potlačení zprávy by mělo být porušení tohoto pravidla opraveno.I když atribut dědí AttributeUsageAttribute, měl by být přítomen pro zjednodušení údržby kódu.
Příklad
Následující příklad definuje dva atributy.BadCodeMaintainerAttribute nesprávně vynechá příkaz AttributeUsageAttribute a GoodCodeMaintainerAttribute správně implementuje atribut, který je popsán výše v této části.Všimněte si, že vlastnost DeveloperName je vyžadovaná pravidlem návrhu CA1019: Definujte přístupové vlastnosti pro argumenty atributu a je zahrnuta pro úplnost.
Imports System
Namespace DesignLibrary
' Violates rule: MarkAttributesWithAttributeUsage.
NotInheritable Public Class BadCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
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)> _
NotInheritable Public Class GoodCodeMaintainerAttribute
Inherits Attribute
Private developer As String
Public Sub New(developerName As String)
developer = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
Get
Return developer
End Get
End Property
End Class
End Namespace
using System;
namespace DesignLibrary
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute :Attribute
{
string developer;
public BadCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
// Satisfies rule: Attributes specify AttributeUsage.
// The attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute :Attribute
{
string developer;
public GoodCodeMaintainerAttribute(string developerName)
{
developer = developerName;
}
public string DeveloperName
{
get
{
return developer;
}
}
}
}
Související pravidla
CA1019: Definujte přístupové vlastnosti pro argumenty atributu
CA1813: Vyhněte se nezapečetěným atributům