Compartilhar via


CA1070: Não declarar os campos de evento como virtuais

Property Valor
ID da regra CA1070
Título Não declarar os campos de evento como virtuais
Categoria Projetar
Correção interruptiva ou sem interrupção Quebra
Habilitado por padrão no .NET 8 Como sugestão

Causa

Um evento do tipo campo foi declarado como virtual.

Por padrão, essa regra apenas analisa os tipos visíveis externamente, mas isso é configurável.

Descrição da regra

Siga estas diretrizes de design do .NET para gerar eventos de classe base em classes derivadas. Não declare eventos virtuais em uma classe base. Eventos substituídos em uma classe derivada têm um comportamento indefinido. O compilador C# não lida com isso corretamente e é imprevisível se um assinante do evento derivado realmente estará assinando o evento de classe base.

using System;
public class C
{
    // CA1070: Event 'ThresholdReached' should not be declared virtual.
    public virtual event EventHandler ThresholdReached;
}

Como corrigir violações

Siga estas diretrizes de design do .NET e evite eventos semelhantes a campos virtuais.

Quando suprimir avisos

Se o evento for uma API pública externamente visível que já faz parte de uma biblioteca enviada, será seguro suprimir um aviso dessa regra para evitar uma alteração interruptiva aos consumidores da biblioteca.

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 CA1070
// The code that's violating the rule is on this line.
#pragma warning restore CA1070

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.CA1070.severity = none

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

Configurar código para analisar

Use a opção a seguir para configurar em quais partes da base de código essa regra deve ser executada.

Você pode configurar essa opção apenas para essa regra, para todas as regras às quais ela se aplica ou para todas as regras nessa categoria (Design) às quais ela se aplica. Para saber mais, confira Opções de configuração de regra de qualidade de código.

Incluir superfícies de API específicas

É possível configurar em quais partes da base de código essa regra deverá ser executada, com base na acessibilidade. Por exemplo, para especificar que a regra deverá ser executada apenas na superfície de API não pública, adicione o seguinte par chave-valor a um arquivo .editorconfig no projeto:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Confira também