2012-02-03 44 views

Respuesta

6

C# Events son una forma específica de delegates. Si ha programado en otros idiomas, como C++, puede comparar un puntero delegate con una función ("método"): apunta a algún código en la memoria. Cuando llama al puntero como método, realmente llama al método en la dirección a la que apunta el puntero.

Esto es necesario para proporcionar el desacoplamiento entre la persona que llama y el destinatario, por lo que no necesita tener todos los métodos listos cuando publica el código que los llama (lo que no sería posible). posiblemente conozca el código que debe llamarse cuando se presiona Button). Llama al puntero y el otro desarrollador lo establece en una dirección de memoria apropiada más adelante.

P.S. delegates y Events sin embargo, tienen otras ventajas sobre los indicadores de función simple: puede estar seguro de que apuntará a un método atractivo, tomando el número y tipo de argumentos correctos y devolviendo el tipo correcto.

3

Un evento en C# es una forma de que una clase proporcione notificaciones a los clientes de esa clase cuando le sucede algo interesante a un objeto.

http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx

un método es un bloque de código que contiene una serie de instrucciones. En C#, cada instrucción ejecutada se hace así en el contexto de un método.

http://msdn.microsoft.com/en-us/library/ms173114%28v=vs.80%29.aspx

+2

Una respuesta terrible a una mala pregunta ... ¡Incluso no entiendo tu explicación de los eventos, y tengo * años * de experiencia con C#! –

+0

@Vladislav Zorov. Agradecemos los comentarios. ¿Podrían por favor dejarnos saber una mejor manera de responder a una pregunta tan básica? –

+1

Desearía poder rechazar la respuesta de Validislav Zorov. Tal vez solo inglés no es lo tuyo? Es una explicación tan fácil. Bien hecho P.K. – sereschkin

10

Un método es simplemente código contenido dentro de una clase para poner en práctica una pieza de funcionalidad. Todo el código en C# está contenido dentro de los métodos.

En cuanto a los eventos, supongamos que tiene una clase simple que implementó un contador (vamos a llamarlo el objeto Counter). Ahora suponga que desea dejar que otros objetos no relacionados con Counter sepan cuándo el recuento llegó a 100. ¿Cómo lo haría?

una manera lógica sería la de permitir que los demás objetos para especificar uno de sus propios métodos que quieren ser llamado cuando la cuenta llega a 100. Cada objeto puede entonces, de forma individual, indicar al objeto de Counter el método que quieren ser llamado. El objeto Counter guarda esta lista de métodos y, cuando el recuento llega a 100, invoca cada uno de los métodos guardados.

Así funcionan los eventos: la clase Counter contiene un miembro de evento (llamado decir, CounterIs100) al que otras instancias de objetos vinculan uno de sus propios métodos. Cuando el objeto Counter detecta que ha alcanzado 100, invoca el miembro CounterIs100 que llama automáticamente a todos los métodos actualmente vinculados a él, notificando a cada objeto que el recuento realmente ha alcanzado 100. Si no hay objetos se ha vinculado un método al miembro del evento CounterIs100, será null, por lo que no es necesario que el objeto Counter invoque al miembro del evento.

class Counter 
{ 
    // this is the count field used to save the current count value 
    private int count; 

    // this is the event member which holds all the methods other objects have specified 
    public event CounterIs100Delegate CounterIs100; 

    // This is a method. It invokes the CounterIs100 event member if anyone has subscribed to it 
    protected void OnCounterIs100() 
    { 
     // see if anyone has subscribed (linked) their method to this event 
     if (CounterIs100 != null) 
     { 
      // invoke the event - this will call all subscribed methods 
      CounterIs100(); 
     } 
    } 

    // This is a method. It increments the counter variable stored by this object 
    public void Increment() 
    { 
     count++; 
     // if the count is 100, invoke the event 
     if (count == 100) 
     OnCounterIs100(); 
    } 

} 

// This is a delegate. It is used to define a template for other objects wishing to 
// subscribe to the CounterIs100 event. The methods other objects link to the 
// CounterIs100 event must match this declaration (although the name can be changed) 
public delegate void CounterIs100Delegate(); 

// This is a class, unrelated to Counter, but uses its events 
class SiteHits 
{ 
    Counter hitCounter = new Counter(); 

    public SiteHits() 
    { 
     // We want to know when the number of site hits reaches 100. 
     // We could monitor this ourselves, but we know the Counter class already 
     // does this, so we just link our method to its event 
     hitCounter.CounterIs100 += this.WhenSiteHitsReaches100; 
    } 

    public void PageRequested() 
    { 
     // someone has requested a page - increment the hit counter 
     Console.WriteLine("We've been hit!"); 
     hitCounter.Increment();    
    } 

    // this is the method we want called when the CounterIs100 event occurs. 
    // note that the return value and parameters match CounterIs100Delegate above. 
    public void WhenSiteHitsReaches100() 
    { 
     Console.WriteLine("Woohoo! We've reached 100 hits!"); 
    } 
} 
+0

Otra forma de notificar sería usar el patrón Observer. Entonces puedes implementar el mismo código sin eventos. ¿Por qué usar eventos y no el patrón Observador? –

+0

@ CodePope porque esta respuesta se codificó hace casi 6 años. Los paradigmas de codificación cambian con el tiempo. – adelphus

+0

El patrón de observador es mucho más antiguo que seis años. Era existente en ese momento que escribiste tu respuesta –

0

Un evento en .net es un par de métodos, uno para "Agregar" y otro para "Eliminar", cada uno de los cuales acepta un delegado. Por lo general, el método "Agregar" tomará el delegado transferido y lo agregará a una lista de delegados o a un MulticastDelegate; pasar a un delegado al evento "Eliminar" que se pasó previamente al método "Agregar" debería eliminar ese delegado de la lista. Si no se solicita lo contrario, tanto C# como vb.net crearán automáticamente los eventos "Agregar" y "Eliminar" que se comportarán como se indicó anteriormente.

Cuestiones relacionadas