CA1018: marcar atributos com AttributeUsageAttribute
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
Categoria |
Microsoft.Design |
Alteração Significativa |
Quebra |
Causa
O atributo de AttributeUsageAttribute não está presente no atributo personalizado.
Descrição da Regra
Quando você define um atributo personalizado, o marcará usando AttributeUsageAttribute para indicar onde o código-fonte no atributo personalizado pode ser aplicado.O significado e o uso planejado de um atributo determinarão seus locais válidos em código.Por exemplo, você pode definir um atributo que identifica a pessoa que é responsável por manter e aprimorar cada tipo em uma biblioteca, e que a responsabilidade sempre é atribuída ao nível do tipo.Nesse caso, os compiladores devem habilitar o atributo em classes, enumerações, e interfaces, mas não deve habilitá-lo em métodos, em eventos, ou propriedades.As políticas e os procedimentos de organização ditariam se o atributo deve ser habilitado em assemblies.
A enumeração de AttributeTargets define os destinos que você pode especificar para um atributo personalizado.Se você omitir AttributeUsageAttribute, o atributo personalizado será válida para todos os destinos, conforme definido pelo valor de All de enumeração de AttributeTargets .
Como Corrigir Violações
Para corrigir uma violação desta regra, especifique destinos para o atributo usando AttributeUsageAttribute.Consulte o exemplo a seguir.
Quando Suprimir Alertas
Você deve corrigir uma violação desta regra em vez de excluir a mensagem.Se o atributo herda AttributeUsageAttribute, o atributo deve estar presente para simplificar a manutenção do código.
Exemplo
O exemplo a seguir define dois atributos.BadCodeMaintainerAttribute omitir incorretamente a instrução de AttributeUsageAttribute , e GoodCodeMaintainerAttribute implementa corretamente o atributo que é descrito anteriormente nesta seção.Observe que a propriedade DeveloperName é exigida pela regra CA1019: definir acessadores para argumentos de atributo de design e é incluída para manter a integridade.
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;
}
}
}
}
Regras Relacionadas
CA1019: definir acessadores para argumentos de atributo
CA1813: evitar atributos não lacrados