Comment supprimer les avertissements du compilateur «[un événement] n'a jamais été utilisé» dans Visual Studio?

93

Par exemple, j'obtiens cet avertissement du compilateur,

L'événement 'Company.SomeControl.SearchClick' n'est jamais utilisé.

Mais je sais qu'il est utilisé car le commenter me lance comme 20 nouveaux avertissements de pages XAML qui tentent d'utiliser cet événement!

Ce qui donne? Y a-t-il une astuce pour se débarrasser de cet avertissement?

jedmao
la source
1
Pouvez-vous s'il vous plaît poster un exemple?
John Saunders

Réponses:

143

Cela semble être l' avertissement 67 et peut donc être supprimé avec:

#pragma warning disable 67

N'oubliez pas de le restaurer au plus vite (après la déclaration d'événement) avec:

#pragma warning restore 67

Cependant, je vérifierais à nouveau et m'assurerais que vous soulevez l'événement quelque part, pas seulement en vous y abonnant . Le fait que le compilateur crache 20 avertissements et non 20 erreurs lorsque vous commentez l'événement est également suspect ...

Il y a aussi un article intéressant sur cet avertissement et en particulier sur la façon dont il s'applique aux interfaces; il y a une bonne suggestion sur la façon de traiter les événements "inutilisés". Les parties importantes sont:

La bonne réponse est d'être explicite sur ce que vous attendez de l'événement, qui dans ce cas, n'est rien:

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

Cela supprimera proprement l'avertissement, ainsi que l'implémentation supplémentaire générée par le compilateur d'un événement normal. Et comme autre avantage supplémentaire, cela incite à se demander si cette implémentation ne rien faire est vraiment la meilleure implémentation. Par exemple, si l'événement n'est pas tellement sans importance qu'il n'est pas pris en charge, de sorte que les clients qui dépendent de la fonctionnalité risquent d'échouer sans elle, il peut être préférable d'indiquer explicitement le manque de support et d'échouer rapidement en lançant un exception:

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

Bien sûr, une interface qui peut être utilement mise en œuvre sans certaines parties de ses fonctionnalités est parfois une indication que l'interface n'est pas cohésive de manière optimale et doit être divisée en interfaces séparées.

lc.
la source
C'est exactement ce dont j'ai besoin! Je vous remercie! La seule différence est que j'ai ajouté mon propre commentaire à côté du 67, donc je savais ce que c'était à l'avenir. Voici "exactement" ce que j'ai tapé ... #pragma warning disable 67 // événement jamais utilisé événement public RoutedEventHandler SearchClick; #pragma warning restore 67
jedmao
12
C'est un excellent lien. Merci.
Max Palmer
C'est utile; ne va pas rester en place, mais juste quelque chose pour faire fonctionner l'idée actuelle ...
dudeNumber4
78

Si vous êtes obligé d'implémenter un événement à partir d'une interface, que votre implémentation n'a pas besoin, vous pouvez effectuer les opérations suivantes pour éviter l'avertissement.

public event EventHandler CanExecuteChanged { add{} remove{} }
Adam Mills
la source
Si je fais cela, il est dit plus tard dans le fichier où je fais if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();que "OnCompleteEvent n'existe pas dans le contexte actuel".
Almo
@Almo, c'est correct. Cependant, vous décrivez le cas où vous utilisez l'événement et donc l'avertissement n'apparaîtra pas, vous n'utiliserez donc pas le correctif pour l'avertissement. Droite? En général, vous disposez d'une interface spécifiant l'événement et deux sous-classes. On n'utilise pas l'événement et utilise cette solution. L'autre utilise l'événement et n'a jamais lancé d'avertissement pour commencer.
Dirk Bester
Cela faisait trop longtemps, mais nous recevions cette erreur même si elle était utilisée. Cela avait quelque chose à voir avec sa définition d'une manière qui a trompé le compilateur en lui faisant croire qu'il n'était pas utilisé.
Almo
Merci beaucoup pour cette solution facile à une situation très exaspérante!
M463 du
14

Le deuxième meilleur moyen est à mon humble avis d'indiquer clairement que l'événement n'est pas pris en charge en lançant une exception si quelqu'un essaie de s'y abonner.

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

En variante, vous pouvez également laisser les méthodes addet removevides pour ignorer silencieusement les abonnements sur l'événement.

La meilleure solution est de refactoriser le code, peut-être d'extraire la déclaration de l'événement à l'implémenteur si possible.

En dernier recours, vous pouvez également désactiver l'avertissement comme ceci

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67
vidstige
la source
Je ne vois pas comment les objets nuls sont pertinents ici
vidstige
Je sais ce qu'est un objet nul, et ce cas d'utilisation est couvert dans le dernier paragraphe. Veuillez lire attentivement la réponse entière.
vidstige
Je sais ce qu'est un objet nul. Je crois que ce cas d'utilisation est couvert par mon dernier paragraphe.
vidstige
3

Vous pouvez également effectuer les opérations suivantes:

public event EventHandler MyEvent = delegate {}
GrantA
la source
1

Le compilateur n'est apparemment pas conscient qu'il est utilisé dans le code XAML. Essayez de supprimer l'avertissement dans votre définition d'événement.

Assurez-vous également de soulever l'événement quelque part.

SLaks
la source
C'est ce que je pensais aussi, alors j'ai déplacé le code XAML vers le code derrière et il a montré le même avertissement! Et oui, je suis sûr à 100% que l'événement est soulevé quelque part. Je regarde bien. Il est câblé à un bouton.
jedmao
1

Vous pouvez supprimer les avertissements individuels.

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

Dans ce cas, CS0219 est l'avertissement concernant les variables affectées mais non utilisées. Vous pouvez soit utiliser l'indicateur / nowarn: 0219, soit ajouter le numéro d'erreur dans le volet des propriétés du projet (sous "Construire", n'oubliez pas de supprimer le premier CS). Gardez à l'esprit que tous les avertissements de cette classe sont supprimés .

Svend
la source
1

Ou vous pouvez ajouter <NoWarn>67</NoWarn>à votre projet

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>
Simon
la source
9
cela désactivera l'avertissement dans tout le projet, cachant potentiellement de vrais problèmes avec des événements inutilisés.
vidstige