Qué problema tiene este código?

“I get down on my knees and I start to pray
Till the tears run down from my eyes, oh
Somebody, somebody, can anybody find me
Somebody to love?”
(“Somebody to love”, Queen, 1976)

Aquí va un puzle que sin dudas resultará sencillo para muchos, pero que puede que le enseñe algo interesante a otros.

El siguiente programa presenta una clase que publica un evento, y otra que se suscribe al mismo. Para simplificar, se asume que el evento no requiere datos personalizados, por lo que es del tipo predefinido EventHandler.

Qué problema(s) tiene la implementación de la clase publicadora? La respuesta – en una próxima entrega.

using System;

namespace ConsoleApplication1
{
    // Class that publishes an event
    class Publisher
    {
        // Declare the event
        public event EventHandler MyEvent;

        public void DoSomething()
        {
            // Block of code that does something

            // Raise the event. You could also raise the event
            // before executing the block of code
            if (MyEvent != null)
            {
                MyEvent(this, EventArgs.Empty);
            }
        }
    }

    //Class that subscribes to an event
    class Subscriber
    {
        public Subscriber(Publisher pub)
        {
            // Subscribe to the event using C# 2.0 syntax
            pub.MyEvent += HandleMyEvent;
        }

        // Define what actions to take when the event is raised
        public void HandleMyEvent(object sender, EventArgs e)
        {
            Console.WriteLine(“Event raised”);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub = new Subscriber(pub);

            // Call the method that raises the event
            pub.DoSomething();

            // etc…
        }
    }
}


Pop/rock tip: Ya hemos hecho referencia anteriormente en este blog a Queen, un grupo que sin lugar a dudas ocupa un lugar muy destacado en la historia del rock. “Somebody to love” es una de mis canciones favoritas, y el ejemplo perfecto (junto con “Bohemian Rhapsody“) de una de las características mas sobresalientes de la música de Queen: las intrincadas armonías vocales. La letra de la canción no tiene nada que ver con el puzle – aunque el título del disco al que la canción pertenece sí ;-).

 (Abril 13 de 2009): El título del álbum en cuestión es “A day at the races“.

Octavio Hernandez

Desarrollador y consultor en tecnologías .NET. Microsoft C# MVP entre 2004 y 2010.

5 comentarios en “Qué problema tiene este código?

  1. Esta en esta linea:
    pub.MyEvent += HandleMyEvent;

    Lo que si tiene que hacer es que se asigna una instancia de EventHandler y ah este hace la referencia a el evento manejador. Con lo que quedaria mas o menos asi

    pub.MyEvent += new EventHandler(HandleMyEvent);

  2. @Carlos lo que propones y lo que ha escrito Octavio es lo mismo. el uso de new EventHandler es redundante con lo que puede ser omitido.

    @Octavio a mi me da la espina que deberia haber algun tema de verificación o prevención en el método DoSomething por si un suscriptor se des-suscribe…

  3. La declaración deberia de ser generica y la subscripción como en el ejemplo.

    private event EventHandler myEvent;

    public event EventHandler MyEvent
    {
    add { myEvent += value; }
    remove { myEvent -= value; }
    }

  4. @Carlos,

    La sintaxis que propones y la que utilizo son equivalentes. La tuya era la unica que exisitia originalmente, la mia fue introducida con C# 2.0.

    @avalon,

    No hay nada malo en que la suscripcion se realice en el constructor de Suscriptor. Probablemente al disennar la clase asi su creador quiso enfatizar que el fin principal de la clase es servir para suscribirse al evento.

    @JM,

    Tienes razon, por ahi van los tiros…

    @Juan,

    Normalmente, eso que propones solo hay que hacerlo cuando quieres redefinir el comportamiento de add o remove, y no es el caso…

    Gracias a todos,

    Octavio

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *