Come posso eliminare gli avvisi del compilatore "[qualche evento] mai usato" in Visual Studio?


93

Ad esempio, ottengo questo avviso del compilatore,

L'evento "Company.SomeControl.SearchClick" non viene mai utilizzato.

Ma so che è usato perché commentarlo mi lancia come 20 nuovi avvisi di pagine XAML che stanno cercando di utilizzare questo evento!

Cosa succede? C'è un trucco per sbarazzarsi di questo avvertimento?


1
Puoi inviare un esempio?
John Saunders,

Risposte:


143

Questo sembra essere l' avviso 67 e può quindi essere soppresso con:

#pragma warning disable 67

Non dimenticare di ripristinarlo il prima possibile (dopo la dichiarazione dell'evento) con:

#pragma warning restore 67

Tuttavia, controllerei di nuovo e mi assicurerei che tu stia promuovendo l'evento da qualche parte, non solo iscrivendoti . Anche il fatto che il compilatore emetta 20 avvisi e non 20 errori quando si commenta l'evento è sospetto ...

C'è anche un articolo interessante su questo avviso e specificamente su come si applica alle interfacce; c'è un buon suggerimento su come affrontare gli eventi "inutilizzati". Le parti importanti sono:

La risposta giusta è essere espliciti su cosa ti aspetti dall'evento, che in questo caso non è niente:

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

Ciò eliminerà in modo pulito l'avviso, nonché l'implementazione aggiuntiva generata dal compilatore di un evento normale. E come un altro vantaggio aggiuntivo, spinge a pensare se questa implementazione non pratica sia davvero la migliore implementazione. Ad esempio, se l'evento non è tanto poco importante quanto non supportato, in modo tale che i client che fanno affidamento sulla funzionalità rischiano di fallire senza di essa, potrebbe essere meglio indicare esplicitamente la mancanza di supporto e fallire velocemente lanciando un eccezione:

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

Naturalmente, un'interfaccia che può essere utilmente implementata senza alcune parti della sua funzionalità a volte è un'indicazione che l'interfaccia non è perfettamente coesa e dovrebbe essere suddivisa in interfacce separate.


È esattamente quello che mi serve! Grazie! L'unica differenza è che ho aggiunto il mio commento accanto al 67, quindi sapevo cosa sarebbe stato in futuro. Ecco "esattamente" quello che ho digitato ... #pragma warning disable 67 // evento mai usato public event RoutedEventHandler SearchClick; #pragma warning restore 67
jedmao

12
È un ottimo collegamento. Grazie.
Max Palmer

Questo è utile; non manterrà in posizione, ma solo qualcosa per far funzionare l'idea corrente ...
dudeNumber4

78

Se sei costretto a implementare un evento da un'interfaccia, che la tua implementazione non ha bisogno, puoi fare quanto segue per evitare l'avviso.

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

Se lo faccio, viene visualizzato più avanti nel file in cui lo faccio if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();"OnCompleteEvent non esiste nel contesto corrente".
Almo

@ Almo, è corretto. Tuttavia, stai descrivendo il caso in cui STAI utilizzando l'evento e quindi l'avviso non verrà visualizzato, quindi non utilizzerai la correzione per l'avviso. Destra? In genere si dispone di un'interfaccia che specifica l'evento e due sottoclassi. Uno non usa l'evento e usa questa soluzione. L'altro usa l'evento e non ha mai lanciato l'avvertimento per cominciare.
Dirk Bester

È passato troppo tempo, ma abbiamo ricevuto questo errore anche se era in uso. Aveva qualcosa a che fare con il fatto che fosse definito in un modo che induceva il compilatore a pensare che non fosse usato.
Almo

Grazie mille per questa facile soluzione a una situazione davvero esasperante!
M463

14

Il secondo modo migliore è che io dichiari chiaramente che l'evento non è supportato lanciando un'eccezione se qualcuno cerca di iscriversi ad esso.

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

Come variante di questo, puoi anche lasciare vuoti i metodi adde removeper ignorare silenziosamente le iscrizioni all'evento.

La soluzione migliore è eseguire il refactoring del codice, magari tirare la dichiarazione dell'evento all'implementatore, se possibile.

Come ultima risorsa, puoi anche disabilitare l'avviso in questo modo

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

Non vedo come gli oggetti nulli siano rilevanti qui
vidstige

So cos'è un oggetto nullo e questo caso d'uso è trattato nell'ultimo paragrafo. Si prega di leggere attentamente l'intera risposta.
vidstige

So cos'è un oggetto nullo. Credo che questo caso d'uso sia coperto dal mio ultimo paragrafo.
vidstige

3

Puoi anche fare quanto segue:

public event EventHandler MyEvent = delegate {}

1

Il compilatore apparentemente non è a conoscenza di essere utilizzato nel codice XAML. Prova a sopprimere l'avviso nella definizione dell'evento.

Inoltre, assicurati di promuovere l'evento da qualche parte.


Questo è quello che pensavo anch'io, quindi ho spostato il codice XAML nel codice sottostante e ha mostrato lo stesso avviso! E sì, sono sicuro al 100% che l'evento sia stato sollevato da qualche parte. Lo sto guardando bene. È collegato a un pulsante.
jedmao

1

È possibile sopprimere i singoli avvisi.

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

In questo caso, CS0219 è l'avviso relativo alle variabili assegnate ma non utilizzate. Puoi utilizzare il flag / nowarn: 0219 o aggiungere il numero di errore nel riquadro delle proprietà del progetto (in "Build", ricordati di rimuovere il CS iniziale). Tieni presente che sopprime tutti gli avvertimenti di questa classe.


1

Oppure puoi aggiungere <NoWarn>67</NoWarn>al tuo progetto

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

9
questo disabiliterà l'avviso nell'intero progetto nascondendo potenzialmente problemi reali con eventi inutilizzati.
vidstige
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.