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"));
TipoRetornoParametrosUso tipico
Actionvoid0-16Callbacks, logging, side effects
Func<TResult>TResult0-16 + retornoTransformacoes, predicados, factories
Predicate<T>bool1Filtros (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.