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

Confira também