2010-03-17 17 views
22

En mi clase quiero declarar un evento al que otras clases puedan suscribirse. ¿Cuál es la forma correcta de declarar el evento?¿Cuál es la sintaxis para declarar un evento en C#?

Esto no funciona:

public event CollectMapsReportingComplete; 
+12

@IlliaRatkevych Me gusta tener esta pregunta aquí, el diseño de SO es más fácil de leer que la mayoría de la documentación de MSDN. –

+10

@IlliaRatkevych No estoy de acuerdo - SO no está destinado a ser utilizado por programadores "expertos", se supone que debe ayudar a todos los desarrolladores de todos los niveles. Esta es una pregunta totalmente legítima en mi honesta opinión. –

Respuesta

33

Se le olvidó mencionar el tipo . Para eventos muy simples, EventHandler podría ser suficiente:

public event EventHandler CollectMapsReportingComplete; 

veces querrá declarar su propio tipo de delegado que se utilizará para sus eventos, lo que permite utilizar un tipo personalizado para el parámetro EventArgs (ver el comentario de Adam Robinson):

public delegate void CollectEventHandler(object source, MapEventArgs args); 

public class MapEventArgs : EventArgs 
{ 
    public IEnumerable<Map> Maps { get; set; } 
} 

también puede utilizar el tipo genérico de EventHandler en lugar de declarar sus propios tipos:

public event EventHandler<MapEventArgs> CollectMapsReportingComplete; 
+2

No vamos a votar negativamente por esto, pero la convención en .NET es que los delegados de evento solo deberían incluir un remitente ('objeto') y un parámetro adicional que herede de' EventArgs'. Hacer esto también le permitirá usar el tipo de delegado genérico 'EventHandler ' en lugar de tener que declarar que es suyo. Por supuesto, no hay nada de malo con su enfoque (funcionará bien), pero la sabiduría imperante favorece el enfoque basado en EventArgs. –

+1

@ Adam: Tiene toda la razón, y he actualizado mi respuesta para reflejar esto. –

7

Es necesario especificar el tipo delegado del evento:

public event Action CollectMapsReportingComplete; 

Aquí he utilizado System.Action pero se puede utilizar cualquier tipo de delegado que desee (incluso un delegado personalizado). Se usará una instancia del tipo de delegado que especifique como campo de respaldo para el evento.

+1

¿Cuál es la diferencia entre EventHandler y Action? – Tilendor

+0

'EventHandler' y' Action' son ambos tipos de delegados: puede especificar libremente cualquier tipo de delegado que desee. –

+3

usando 'Action' no sigue la sintaxis del evento estándar de .NET ... – thecoop

2
public event EventHandler MyEvent; 
3

Un ejemplo

/// </summary> 
/// Event triggered when a search is entered in any <see cref="SearchPanel"/> 
/// </summary> 
public event EventHandler<string> SearchEntered 
{ 
    add { searchevent += value; } 
    remove { searchevent -= value; } 
} 
private event EventHandler<string> searchevent; 
0

evento público [DelegateType] [eventName];

Cuestiones relacionadas