2010-04-06 15 views
11

He estado examinando una de mis C# libros y yo sólo vi una frase acerca de eventos en C#:
  El objetivo principal de eventos es para evitar que los suscriptores de interferir unos con otros.El objetivo principal de eventos en C#

Sea lo que sea lo que signifique, sí, en realidad los eventos funcionan más o menos como los delegados.
Me he estado preguntando por qué debería usar eventos en lugar de delegados.

¿Hay alguien que pueda explicar la parte en negrita?

Gracias de antemano.

Respuesta

15

La elección no sería realmente entre un delegado y un evento: son cosas completamente diferentes. Sin embargo, podría exponer una propiedad pública o un campo público que tenía un tipo de delegado. Supongo que eso es lo que realmente quieres decir.

Suponer que Button.Click fuera del dominio público o propiedad en lugar de un evento. Una pieza de código podría entonces suscribirse a un evento y otro, entonces podría escribir:

// Invalid with events, valid with properties 
button.Click = null; 

limpiando de este modo el controlador de eventos originales. Del mismo modo otro código también sería capaz de invocación los controladores de eventos:

// Invalid with events, valid with properties 
button.Click(this, EventArgs.Empty); 

a pesar de que no se ha hecho clic en el botón. Esto es claramente una violación de la encapsulación. La única razón para exponer Click a otro código es permitirles registrar interés en los clics de botón y registrar el desinterés más tarde, y esas son exactamente las habilidades que proporcionan los eventos.

Piense en los eventos como azúcar sintáctico en torno a dos métodos. Por ejemplo, si no tenemos eventos a continuación Button probablemente tendría:

public void AddClickHandler(EventHandler handler) 
public void RemoveClickHandler(EventHandler handler) 

La violación de encapsulación se va, pero se perderá parte de la comodidad - y todos tienen que escribir sus propios métodos por el estilo. Los eventos simplifican este patrón, básicamente.

9

Un evento solo puede ser invocado por la clase que lo define, mientras que un delegado puede invocarse desde cualquiera que tenga acceso a él. Esto es lo que creo que significa el texto en negrita.

Además, un evento puede definirse en una interfaz, mientras que un delegado no puede (como declararía el delegado como un campo).

Recomiendo dar this link una lectura, ya que lo explica muy bien y tiene algunos ejemplos más que los mencionados anteriormente.

+0

Usted podría declarar al delegado como una propiedad, por supuesto. Esa sería una analogía más apropiada. –

+0

Acabo de echarle un vistazo a ese artículo; no me gusta, ya que suena como que los eventos son solo campos modificados de tipo delegado. No hay nada que decir que un evento tiene que estar respaldado por un campo de ese tipo * en absoluto *.Son más como propiedades que campos. –

+0

@Jon - Justo, puede entender eso. –

3

Puede establecer un delegado en NULL lo que hace que 'olvide' cada función que está suscrita a él.

0

Puede agregar tantos manejadores de eventos a su evento como desee.

+2

Los delegados también son multidifusión. De hecho, un evento suele estar respaldado por un solo campo del tipo de delegado relevante. –

+0

Creo que en realidad es un mito bastante común que los delegados son solteros. Muchos desarrolladores de C# que conozco piensan que la principal diferencia entre los dos es que los delegados son de un solo elenco, mientras que los eventos son de transmisión múltiple, ¡pero no es así! –

+0

Gracias por la información. Eso es realmente nuevo para mí: /! – chriszero