Partilhar via


CA1813: Evite atributos não selados

Propriedade valor
ID da regra CA1813
Cargo Evite atributos sem lacre
Categoria Desempenho
A correção está quebrando ou não quebrando Quebrando
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 de atributos. Por exemplo, System.Attribute.GetCustomAttribute procura o tipo de atributo especificado ou qualquer tipo de atributo que estenda o tipo de atributo especificado. A selagem do atributo elimina a pesquisa através da hierarquia de herança e pode melhorar o desempenho.

Como corrigir violações

Para corrigir uma violação desta regra, sela o tipo de atributo ou torne-o abstrato.

Quando suprimir avisos

É seguro suprimir uma advertência desta regra. Suprima somente se estiver definindo uma hierarquia de atributos e não puder selar o atributo ou torná-lo abstrato.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA1813.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplo

O exemplo a seguir mostra um atributo personalizado que satisfaz 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

Consulte também