Como me livro dos avisos do compilador “[algum evento] nunca usado” no Visual Studio?


93

Por exemplo, recebo este aviso do compilador,

O evento 'Company.SomeControl.SearchClick' nunca é usado.

Mas eu sei que é usado porque comentá-lo me lança cerca de 20 novos avisos de páginas XAML que estão tentando usar esse evento!

O que da? Existe um truque para se livrar desse aviso?


1
Você pode postar um exemplo?
John Saunders

Respostas:


143

Isso parece ser o aviso 67 e pode, portanto, ser suprimido com:

#pragma warning disable 67

Não se esqueça de restaurá-lo o mais rápido possível (após a declaração do evento) com:

#pragma warning restore 67

No entanto, gostaria de verificar novamente e ter certeza de que você está promovendo o evento em algum lugar, não apenas se inscrevendo nele. O fato de o compilador emitir 20 avisos e não 20 erros quando você comenta o evento também é suspeito ...

Também há um artigo interessante sobre esse aviso e, especificamente, como ele se aplica a interfaces; há uma boa sugestão sobre como lidar com eventos "não utilizados". As partes importantes são:

A resposta certa é ser explícito sobre o que você espera do evento, que, neste caso, não é nada:

public event EventHandler Unimportant
{
    add { }
    remove { }
}

Isso suprimirá de forma limpa o aviso, bem como a implementação extra gerada pelo compilador de um evento normal. E, como outro benefício adicional, leva a pessoa a pensar se essa implementação sem ação é realmente a melhor implementação. Por exemplo, se o evento não é tão sem importância quanto é sem suporte, de forma que os clientes que dependem da funcionalidade provavelmente falharão sem ela, pode ser melhor indicar explicitamente a falta de suporte e falhar rapidamente lançando um exceção:

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}

Obviamente, uma interface que pode ser implementada de maneira útil sem algumas partes de sua funcionalidade às vezes é uma indicação de que a interface não é perfeitamente coesa e deve ser dividida em interfaces separadas.


É exatamente disso que preciso! Obrigado! A única diferença é que adicionei meu próprio comentário ao lado do 67 para saber o que seria no futuro. Aqui está "exatamente" o que eu digitei ... #pragma aviso desabilitar 67 // evento nunca usado evento público RoutedEventHandler SearchClick; #pragma aviso restauração 67
jedmao

12
Esse é um ótimo link. Obrigado.
Max Palmer

Isso é útil; não vai continuar no lugar, mas apenas algo para colocar a ideia atual em execução ...
dudeNumber4 01 de

78

Se você for forçado a implementar um evento de uma interface, que sua implementação não precisa, você pode fazer o seguinte para evitar o aviso.

public event EventHandler CanExecuteChanged { add{} remove{} }

Se eu fizer isso, diz mais tarde no arquivo onde faço if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();que "OnCompleteEvent não existe no contexto atual".
Almo

@Almo, isso é correto. No entanto, você está descrevendo o caso em que ESTÁ usando o evento e, portanto, o aviso não seria exibido, portanto, você não usaria a correção para o aviso. Certo? Normalmente, você tem uma interface que especifica o evento e duas subclasses. Não se usa o evento e se usa essa solução. O outro usa o evento e nunca lançou o aviso para começar.
Dirk Bester de

Já faz muito tempo, mas estávamos recebendo esse erro, embora ele estivesse sendo usado. Teve algo a ver com ser definido de uma forma que enganou o compilador fazendo-o pensar que não era usado.
Almo de

Muito obrigado por esta solução fácil para uma situação muito enlouquecedora!
M463

14

A segunda melhor maneira é deixar claro que o evento não é suportado, lançando uma exceção se alguém tentar se inscrever nele.

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { throw new NotSupportedException(); }
}

Como uma variante disso, você também pode simplesmente deixar os métodos adde removevazios para ignorar silenciosamente as inscrições no evento.

A melhor solução é refatorar o código, talvez puxar a declaração do evento para o implementador, se possível.

Como último recurso, você também pode desativar o aviso como tal

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67

Não vejo como os objetos nulos são relevantes aqui
vidstige

Eu sei o que é um objeto nulo e esse caso de uso é abordado no último parágrafo. Por favor, leia a resposta completa com atenção.
vidstige

Eu sei o que é um objeto nulo. Acredito que esse caso de uso seja abordado em meu último parágrafo.
vidstige

3

Você também pode fazer o seguinte:

public event EventHandler MyEvent = delegate {}

1

O compilador aparentemente não está ciente de que está sendo usado no código XAML. Tente suprimir o aviso em sua definição de evento.

Além disso, certifique-se de que você está realmente criando o evento em algum lugar.


Foi o que pensei também, então movi o código XAML para o código por trás e ele mostrou o mesmo aviso! E sim, tenho 100% de certeza de que o evento está sendo gerado em algum lugar. Estou olhando bem para ele. Está conectado a um botão.
jedmao

1

Você pode suprimir avisos individuais.

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

Nesse caso, CS0219 é o aviso sobre as variáveis ​​sendo atribuídas, mas não usadas. Você pode usar o sinalizador / nowarn: 0219 ou adicionar o número do erro no painel de propriedades do projeto (em "Build", lembre-se de remover o CS inicial). Lembre-se de suprimir todos os avisos dessa classe.


1

Ou você pode adicionar <NoWarn>67</NoWarn>ao seu projeto

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>

9
isso desativará o aviso em todo o projeto, potencialmente ocultando problemas reais com eventos não utilizados.
vidstige
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.