C# de los fundamentos al dominio — Lección 5
Pasar acciones a través de delegados, eventos y lambdas
Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.
Los métodos se pueden llamar directamente, pero la acción en sí que se ejecutará más tarde también se puede pasar como un valor. Los delegados, eventos y lambdas en C# expresan este flujo.
delegar
int Double(int value) => value * 2;
Func<int, int> operation = Double;
int result = operation(10);
Action<string> logger = message => Console.WriteLine(message);
logger("Battle started");
Func<int, int> es una acción que recibe un int y devuelve un int, y Action es una acción que no tiene valor de retorno. El código de llamada no necesita saber qué método se está ejecutando realmente.
evento
public sealed class Player
{
public event Action<int>? HealthChanged;
public int Health { get; private set; } = 100;
public void TakeDamage(int amount)
{
Health = Math.Max(0, Health - amount);
HealthChanged?.Invoke(Health);
}
}
player.HealthChanged += health => healthBar.SetValue(health);
Los eventos notifican a los objetos con estado sobre los cambios y hacen que otros objetos, como la interfaz de usuario o los sonidos, respondan. Desde el exterior, solo puede suscribirse y darse de baja, y los eventos no se pueden llamar a voluntad.
Gestión de por vida de la suscripción
void OnEnable()
{
player.HealthChanged += UpdateHealth;
}
void OnDisable()
{
player.HealthChanged -= UpdateHealth;
}
Si un objeto de corta duración continúa suscribiéndose a eventos de un objeto de larga duración, es posible que queden memoria y llamadas. La ubicación registrada y la ubicación de liberación correspondiente deben determinarse conjuntamente.
captura lambda
int bonus = 5;
Func<int, int> addBonus = damage => damage + bonus;
Si una lambda usa una variable local externa, se puede crear un objeto para almacenar el valor. Continuar creando lambdas de captura en código que se repite en cada cuadro puede resultar en asignaciones innecesarias.
Los delegados son tipos de acciones y los eventos crean límites para las notificaciones de cambios. Reemplazar todas las llamadas con eventos por razones de conveniencia dificulta el seguimiento del orden de ejecución, por lo que debe usarse cuando se necesita un acoplamiento flexible.