Delegati: Azione predicata Func

Qualcuno può fornire una buona spiegazione (si spera con esempi) di questi 3 delegati più importanti:

  • Predicato
  • Azione
  • Func

Di quali altri delegati dovrebbe essere a conoscenza uno sviluppatore C #?

Quanto spesso li usi nel codice di produzione?

  • Predicate : essenzialmente Func ; pone la domanda “l’argomento specificato soddisfa la condizione rappresentata dal delegato?” Utilizzato in cose come List.FindAll.

  • Action : eseguire un’azione in base agli argomenti. Scopo molto generale Non usato molto in LINQ poiché implica effetti collaterali, in pratica.

  • Func : utilizzato estesamente in LINQ, solitamente per trasformare l’argomento, ad esempio proiettando una struttura complessa su una proprietà.

Altri delegati importanti:

  • EventHandler / EventHandler : utilizzato in tutto WinForms

  • Comparison : come IComparer ma in forma delegata.

Action , Func e Predicate appartengono tutti alla famiglia delegata.

Action : l’azione può richiedere n parametri di input, ma restituisce nulla.

Func : Func può prendere n parametri di input ma restituirà sempre il risultato del tipo fornito. Func , qui T1, T2, T3 sono parametri di input e TResult ne è l’output.

Predicate : Predicate è anche una forma di Func, ma restituirà sempre bool. In parole semplici è wrapper di Func .

Oltre alla risposta di Jon, c’è anche

  • Converter : è essenzialmente Func , ma con semantica. Utilizzato da List.ConvertAll e Array.ConvertAll, ma personalmente non l’ho visto da nessun’altra parte.

MethodInvoker è uno di quelli che gli sviluppatori di WinForms possono usare; non accetta argomenti e non restituisce risultati. Precede Azione, ed è ancora spesso usato quando si richiama il thread dell’interfaccia utente dal momento che BeginInvoke () e altri accettano un Delegato non tipizzato; anche se l’azione andrà altrettanto bene.

 myForm.BeginInvoke((MethodInvoker)delegate { MessageBox.Show("Hello, world..."); }); 

Sarei anche a conoscenza di ThreadStart e ParameterizedThreadStart; di nuovo la maggior parte delle persone sostituirà un’azione in questi giorni.

Predicato, Func e Action sono istanze delegate integrate di .NET. Ciascuna di queste istanze delegate potrebbe fare riferimento o puntare a metodi utente con firma specifica.

Azione delegata: le istanze delegate all’azione possono indicare metodi che accettano argomenti e restituiscono nulla.

Func delegate – Func delegate instance potrebbe puntare a metodi che accettano un numero variabile di argomenti e restituiscono un certo tipo.

Predicato – I predicati sono simili alle istanze delegate funzionali e potrebbero puntare a metodi che accettano un numero variabile di argomenti e restituiscono un tipo di bool.

Gli altri hanno già menzionato gli usi corretti dei delegati specifici, ma vorrei aggiungere qualcosa che completi le loro risposte. I nomi Func, Action, Predicate hanno un background matematico. Per mantenere le cose semplici, darò una definizione informale di una funzione matematica come questa:

Una funzione è una relazione tra insiemi. Prendiamo un membro di un set e lo usiamo come input e la funzione associa questo input a un solo membro dell’altro set. In altre parole, qualcosa viene immesso e produce output.

Di nuovo, informalmente, un predicato matematico è un’affermazione che può essere vera o falsa a seconda delle sue variabili. Come altri hanno menzionato una funzione che restituisce booleana.

Infine, Action è una funzione di vuoto (o il metodo o la procedura name-void più matematicamente corretta)

Azione e Func con lambda:

 person p = new person(); Action mydel = p.add; /*(int a, int b) => { Console.WriteLine(a + b); };*/ Func mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/ mydel(2, 3); string s1= mydel1(" Akhil"); Console.WriteLine(s1); Console.ReadLine(); 

Func è più LINQ friendly, può essere passato come parametro.

Il predicato non può, deve essere nuovamente avvolto.

 Predicate IsPositivePred = i => i > 0; Func IsPositiveFunc = i => i > 0; new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again new []{2,-4}.Where(IsPositivePred); //Compile Error new []{2,-4}.Where(IsPositiveFunc); //Func as Parameter