Compartilhar via


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 10 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
{
    public DeveloperAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; }
}
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

Confira também