CA1018: Atributos de marca com AttributeUsageAttribute
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Quebrando |
Causa
O System.AttributeUsageAttribute atributo não estiver presente no atributo personalizado.
Descrição da regra
Quando você define um atributo personalizado, marcá-la usando AttributeUsageAttribute para indicar onde o código-fonte do atributo personalizado pode ser aplicado. O que significa e pretendido o uso de um atributo determinará seus locais válidos no código. Por exemplo, você pode definir um atributo que identifica a pessoa a quem é responsável por manter e aprimorar a cada tipo de uma biblioteca e responsabilidade é sempre atribuída no nível do tipo. Nesse caso, compiladores devem ativar o atributo em classes, enumerações e interfaces, mas não devem ativá-lo em métodos, eventos ou propriedades. Procedimentos e diretivas organizacionais determinaria se o atributo deve ser ativado em assemblies.
O System.AttributeTargets enumeração define os destinos que você pode especificar para um atributo personalizado. Se você omitir AttributeUsageAttribute, o atributo personalizado será válido para todos os destinos, conforme definido pela All o valor de AttributeTargets enumeração.
Como corrigir violações
Para corrigir uma violação desta regra, especifique os destinos para o atributo usando AttributeUsageAttribute. Consulte o exemplo a seguir.
Quando suprimir avisos
Você deve corrigir uma violação desta regra em vez de excluir a mensagem. Mesmo 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. BadCodeMaintainerAttributeOmite incorretamente a AttributeUsageAttribute de instrução, e GoodCodeMaintainerAttribute corretamente implementa o atributo que é descrito anteriormente nesta seção. Observe que a propriedade DeveloperName é necessária para a regra de design CA1019: Definir acessadores para argumentos de atributo e é incluída para completude.
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: Evite atributos sem lacre