¿Cómo me deshago de las advertencias del compilador "[algún evento] nunca usado" en Visual Studio?

93

Por ejemplo, recibo esta advertencia del compilador,

El evento 'Company.SomeControl.SearchClick' nunca se usa.

¡Pero sé que se usa porque comentarlo me arroja como 20 nuevas advertencias de páginas XAML que están tratando de usar este evento!

¿Lo que da? ¿Existe algún truco para deshacerse de esta advertencia?

jedmao
fuente
1
¿Puedes publicar un ejemplo?
John Saunders

Respuestas:

143

Esto parece ser la advertencia 67 y, por lo tanto, se puede suprimir con:

#pragma warning disable 67

No olvide restaurarlo lo antes posible (después de la declaración del evento) con:

#pragma warning restore 67

Sin embargo, lo comprobaría de nuevo y me aseguraría de que esté promocionando el evento en algún lugar, no solo suscribiéndolo . El hecho de que el compilador escupe 20 advertencias y no 20 errores cuando comenta el evento también es sospechoso ...

También hay un artículo interesante sobre esta advertencia y específicamente cómo se aplica a las interfaces; hay una buena sugerencia sobre cómo lidiar con eventos "no utilizados". Las partes importantes son:

La respuesta correcta es ser explícito sobre lo que espera del evento, que en este caso no es nada:

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

Esto suprimirá limpiamente la advertencia, así como la implementación extra generada por el compilador de un evento normal. Y como otro beneficio adicional, invita a pensar si esta implementación de no hacer nada es realmente la mejor implementación. Por ejemplo, si el evento no es tan poco importante como no es compatible, de modo que los clientes que confían en la funcionalidad pueden fallar sin ella, podría ser mejor indicar explícitamente la falta de soporte y fallar rápidamente lanzando un excepción:

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

Por supuesto, una interfaz que se puede implementar de manera útil sin algunas partes de su funcionalidad es a veces una indicación de que la interfaz no es óptimamente cohesiva y debe dividirse en interfaces separadas.

lc.
fuente
¡Eso es exactamente lo que necesito! ¡Gracias! La única diferencia es que agregué mi propio comentario al lado del 67, así que sabía lo que era en el futuro. Esto es "exactamente" lo que escribí ... #pragma warning disable 67 // evento nunca usado evento público RoutedEventHandler SearchClick; #pragma warning restore 67
jedmao
12
Ese es un gran vínculo. Gracias.
Max Palmer
Esto es útil; no se mantendrá en su lugar, pero solo algo para que la idea actual funcione ...
dudeNumber4
78

Si se ve obligado a implementar un evento desde una interfaz, que su implementación no necesita, puede hacer lo siguiente para evitar la advertencia.

public event EventHandler CanExecuteChanged { add{} remove{} }
Adam Mills
fuente
Si hago esto, dice más adelante en el archivo donde hago if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();que "OnCompleteEvent no existe en el contexto actual".
Almo
@Almo, eso es correcto. Sin embargo, está describiendo el caso en el que ESTÁ usando el evento y, por lo tanto, la advertencia no se mostraría, por lo que no usaría la solución para la advertencia. ¿Correcto? Por lo general, tiene una interfaz que especifica el evento y dos subclases. Uno no usa el evento y usa esta solución. El otro usa el evento y nunca lanzó la advertencia para empezar.
Dirk Bester
Ha pasado demasiado tiempo, pero recibimos este error a pesar de que se estaba utilizando. Tuvo algo que ver con que se definiera de una manera que engañó al compilador haciéndole creer que no se usó.
Almo
¡Muchas gracias por esta fácil solución a una situación tan desesperante!
M463
14

La segunda mejor manera es, en mi humilde opinión, indicar claramente que el evento no es compatible al lanzar una excepción si alguien intenta suscribirse.

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

Como variante de esto, también puede dejar los métodos addy removevacíos para ignorar silenciosamente las suscripciones en el evento.

La mejor solución es refactorizar el código, quizás extraer la declaración del evento al implementador si es posible.

Como último recurso, también puede desactivar la advertencia así

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67
vidstige
fuente
No veo qué tan relevantes son los objetos nulos aquí
vidstige
Sé lo que es un objeto nulo y este caso de uso se trata en el último párrafo. Lea la respuesta completa con atención.
vidstige
Sé lo que es un objeto nulo. Creo que este caso de uso está cubierto por mi último párrafo.
vidstige
3

También puede hacer lo siguiente:

public event EventHandler MyEvent = delegate {}
GrantA
fuente
1

El compilador aparentemente no es consciente de que se está utilizando en código XAML. Intente suprimir la advertencia en la definición de su evento.

Además, asegúrate de estar planteando el evento en algún lugar.

SLaks
fuente
Eso es lo que pensé también, así que moví el código XAML al código detrás y mostró la misma advertencia. Y sí, estoy 100% seguro de que el evento se está planteando en alguna parte. Lo estoy mirando directamente. Está conectado a un botón.
jedmao
1

Puede suprimir advertencias individuales.

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

En este caso, CS0219 es la advertencia con respecto a las variables que se asignan pero no se utilizan. Puede usar la marca / nowarn: 0219 o agregar el número de error en el panel de propiedades del proyecto (en "Generar", recuerde eliminar el CS principal). Tenga en cuenta que suprime todas las advertencias de esta clase.

Svend
fuente
1

O puede agregar <NoWarn>67</NoWarn>a su proyecto

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>
Simón
fuente
9
esto desactivará la advertencia en todo el proyecto, ocultando potencialmente problemas reales con eventos no utilizados.
vidstige