Los eventos se basan en el concepto de delegados, un delegado es básicamente una definición de firma de método. Eso es todo. Al igual que en una interfaz, cómo defines las firmas de método, pero no las implementas, lo haces en todas las clases que heredan esa interfaz.
Un delegado es una definición para una firma de método, y para el cual se pueden definir tantos del cuerpo del método Es usted como, por ejemplo, teniendo en cuenta esto (definición del método de firma) delegado:
public delegate void ChangingHandler (object sender, CarArgs ca);
Se puede definir cuerpos con este delegado (método de firma definición) como tal:
public void SomeMethodWhichCreatesADelegateBody()
{
ChangingHandler myChangingHandler = new ChangingHandler(
delegate(object sender, EventArgs e) { /* the method body for myChangingHandler */ }
);
}
este es un estilo antiguo de definir un delegado sin embargo, ahora es más fácil de leer para usar lambdas en lugar de la palabra clave delegada para crear el cuerpo del método como lo hice , pero eso no es importante para el problema.
Ahora los eventos se pueden imaginar como un delegado (definición de firma de método) con una matriz de cuerpos que se denominan suscripciones al evento, la sintaxis para suscribir un cuerpo de método a un evento es +=
y también hay sintaxis para la eliminación de un cuerpo de método de una suscripción de eventos que es -=
Así que este código aquí se define una matriz del cuerpo para el delegado ChangingHandler (método de firma definición):
public event ChangingHandler Change;
Y puede suscribirse de cuerpo (añadirlos a la matriz) a esta agrupación por calli ng en un método:
public void SomeMethodWhichSubscribesADelegateBodyToAnEvent()
{
ChangingHandler myChangingHandler = new ChangingHandler(
delegate(object sender, EventArgs e) { /* the method body for myChangingHandler */ }
);
Change += myChangingHandler;
}
Ahora toda la razón para que el evento tiene una gran variedad de bodys método, que se llega a definir y añadir como desee, es por lo que cada vez que un evento ocurre en el interior del objeto que se posee el evento, ese objeto puede ejecutar todos esos métodos para hacer lo que quiera que se haga cuando ocurre ese evento. El objeto que posee el objeto tiene este aspecto:
if (Change != null) // You wouldn't access an array without making sure it wasn't null, would you?
{
Change(this, new CarArgs()); // This executes every method body in it's array using the signature definition the delegate defined.
// The delegate simply exists so this code knows the method signature
// so it can know how to call those method body's for you.
}
Tenga en cuenta que no necesita crear explícitamente la instancia de delegado. Puedes hacer 'car.Change + = car_Change;' (esto es bastante idiomático) – bruceboughton