Atributos de marca com AttributeUsageAttribute
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
Category (Categoria) |
Microsoft.Design |
Quebrando alterar |
Quebrando |
Causa
The System.AttributeUsageAttribute atributo não está presente no atributo personalizado.
Descrição da regra
Ao definir um atributo personalizado, marcá-la usando AttributeUsageAttribute para indicar onde no código-fonte do atributo personalizado pode ser aplicado. Significado de um atributo e o uso pretendido determinará seus locais válido no código.Por exemplo, se você está definindo um atributo que identifica a pessoa responsável pela manutenção e aumentar cada tipo de uma biblioteca e responsabilidade é sempre atribuída no nível de tipo, compiladores devem permitir que o atributo em classes, enumerações e interfaces, mas não devem permitir que ele em métodos, eventos ou propriedades.Procedimentos e diretivas organizacionais seriam determinam se o atributo deve ter permissão em assemblies.
The 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 sistema autônomo destinos, conforme definido pela All
Como corrigir violações
Para corrigir uma violação dessa regra, especificar 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.BadCodeMaintainerAttribute omite incorretamente o AttributeUsageAttribute demonstrativo, enquanto GoodCodeMaintainerAttribute implementa corretamente o atributo descrito acima. Observe que a propriedade DeveloperName é necessário para a regra de criação Definir acessadores para argumentos de atributo e é fornecido como complemento.
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
Definir acessadores para argumentos de atributo