CA1813: Evitar atributos não selados
Property | Valor |
---|---|
ID da regra | CA1813 |
Título | Evitar atributos não selados |
Categoria | Desempenho |
Correção interruptiva ou sem interrupção | Quebra |
Habilitado por padrão no .NET 8 | Não |
Causa
Um tipo público herda de System.Attribute, não é abstrato e não é selado (NotInheritable
no Visual Basic).
Descrição da regra
O .NET fornece métodos para recuperar atributos personalizados. Por padrão, esses métodos pesquisam a hierarquia de herança do atributo. Por exemplo, System.Attribute.GetCustomAttribute pesquisa o tipo de atributo especificado ou qualquer tipo de atributo que estenda o tipo de atributo especificado. A validação do atributo elimina a pesquisa na hierarquia de herança e pode melhorar o desempenho.
Como corrigir violações
Para corrigir uma violação dessa regra, sele o tipo de atributo ou torne-o abstrato.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra. Suprima somente se você estiver definindo uma hierarquia de atributo e não puder selar o atributo nem torná-lo abstrato.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA1813
// The code that's violating the rule is on this line.
#pragma warning restore CA1813
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1813.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplo
O exemplo a seguir mostra um atributo personalizado que atende a essa regra.
// Satisfies rule: AvoidUnsealedAttributes.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public sealed class DeveloperAttribute : Attribute
{
private string nameValue;
public DeveloperAttribute(string name)
{
nameValue = name;
}
public string Name
{
get
{
return nameValue;
}
}
}
Imports System
Namespace ca1813
' Satisfies rule: AvoidUnsealedAttributes.
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Struct)>
Public NotInheritable Class DeveloperAttribute
Inherits Attribute
Public Sub New(name As String)
Me.Name = name
End Sub
Public ReadOnly Property Name() As String
End Class
End Namespace
Regras relacionadas
- CA1019: Definir acessadores para argumentos de atributo
- CA1018: Marcar atributos com AttributeUsageAttribute