Sobes.tech
Junior — Middle

¿Cómo distinguir un delegado de un evento y cuáles son sus principales diferencias?

sobes.tech AI

Respuesta de la IA

En C# el delegado es un tipo que representa una referencia a un método con una firma específica. Los delegados permiten llamar a métodos de forma indirecta, pasándolos como parámetros o almacenándolos para su uso posterior.

El evento es un mecanismo basado en delegados que se utiliza para notificar a los suscriptores sobre la ocurrencia de una acción o un cambio de estado. El evento encapsula el delegado y limita el acceso a él: los suscriptores solo pueden agregar o eliminar manejadores, pero no pueden invocar el evento directamente.

Diferencias principales:

  • El delegado es un tipo, el evento es un miembro de clase que utiliza un delegado.
  • El delegado puede ser invocado directamente, el evento no (la invocación del evento solo es posible dentro de la clase donde se declara).
  • El evento proporciona encapsulación y seguridad, previniendo llamadas arbitrarias a los manejadores desde fuera.

Ejemplo:

public delegate void Notify(string message); // delegado

public class Process
{
    public event Notify ProcessCompleted; // evento

    public void Start()
    {
        // ... ejecución del proceso
        OnProcessCompleted("Proceso completado");
    }

    protected virtual void OnProcessCompleted(string msg)
    {
        ProcessCompleted?.Invoke(msg); // invocación del evento
    }
}

// Uso:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // suscripción
process.Start();