Delegates & Events
Function pointers type-safe, multicast, eventos e o pattern publisher/subscriber em C#
Um delegate Γ© um ponteiro para funΓ§Γ£o type-safe.
Action para void, Func para retorno. Events restringem o delegate para que apenas o publisher possa invocar β subscribers usam += / -=. Action β metodo void
Action<T> representa um metodo void que aceita parametros tipados. Lambdas sao atribuidas implicitamente se a assinatura bater.
// Action<T> β void method, aceita parametros tipados
Action<string> log = msg => Console.WriteLine($"LOG: {msg}");
log("hello"); // prints "LOG: hello"
Func β metodo com retorno
Func<T1, T2, TResult> retorna TResult. O ultimo tipo generico e sempre o retorno.
// Func<T1, T2, TResult> β retorna TResult (ultimo tipo generico)
Func<int, int, int> add = (a, b) => a + b;
int sum = add(2, 3); // 5
Closures β captura de variaveis
Lambdas capturam variaveis por referencia. Cuidado com lifetime e valores inesperados (especialmente em loops).
// Lambda captura variaveis por referencia (closure)
Action counter = null!;
int n = 0;
counter = () => { n++; Console.WriteLine(n); };
counter(); // 1
counter(); // 2
Passando comportamento como parametro
Delegates habilitam APIs higher-order: passe comportamento em vez de adicionar flags ou switches.
// Passando comportamento como parametro
static void Repeat(int times, Action body)
{
for (int i = 0; i < times; i++) body();
}
Repeat(3, () => Console.WriteLine("tick"));
| Tipo | Retorno | Parametros | Uso tipico |
|---|---|---|---|
Action | void | 0-16 | Callbacks, logging, side effects |
Func<TResult> | TResult | 0-16 + retorno | Transformacoes, predicados, factories |
Predicate<T> | bool | 1 | Filtros (equivale a Func<T, bool>) |
Quando usar delegate customizado vs Func/Action?
Prefira
Func/Action para assinaturas comuns. Use delegate customizado apenas quando o nome comunica intencao do dominio ou precisa de XML-doc especifico. Ex: delegate bool IntPredicate(int x) adiciona clareza semantica.