Delegados: Predicate Action Func

¿Alguien puede proporcionar una buena explicación (con suerte con ejemplos) de estos 3 delegates más importantes:

  • Predicado
  • Acción
  • Func

¿Qué otros delegates debería tener en cuenta un desarrollador de C #?

¿Con qué frecuencia los usas en el código de producción?

  • Predicate : esencialmente Func ; hace la pregunta “¿el argumento especificado satisface la condición representada por el delegado?” Usado en cosas como List.FindAll.

  • Action : realizar una acción dados los argumentos. Muy general No se usa mucho en LINQ ya que implica efectos secundarios, básicamente.

  • Func : se usa extensamente en LINQ, generalmente para transformar el argumento, por ejemplo, proyectando una estructura compleja a una propiedad.

Otros delegates importantes:

  • EventHandler / EventHandler : usado en WinForms

  • Comparison : Me gusta IComparer pero en forma de delegado.

Action , Func y Predicate pertenecen a la familia de delegates.

Action : la acción puede tomar n parámetros de entrada, pero vuelve vacía.

Func : Func puede tomar n parámetros de entrada, pero siempre devolverá el resultado del tipo proporcionado. Func , aquí T1, T2, T3 son parámetros de entrada y TResult es la salida de este.

Predicate : Predicado es también una forma de Func pero siempre regresará bool. En palabras simples, es envoltorio de Func .

Además de la respuesta de Jon, también hay

  • Converter : Es esencialmente Func , pero con semántica. Utilizado por List.ConvertAll y Array.ConvertAll, pero personalmente no lo he visto en ningún otro lado.

MethodInvoker es uno que los desarrolladores de WinForms pueden usar; no acepta argumentos y no arroja resultados. Es anterior a la Acción, y todavía se usa a menudo cuando se invoca en el hilo de la interfaz de usuario ya que BeginInvoke () et al aceptan un delegado sin tipo; aunque Acción lo hará igual de bien.

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

También conocería ThreadStart y ParameterizedThreadStart; de nuevo, la mayoría de la gente sustituirá una Acción en estos días.

Predicate, Func y Action son instancias de delegado integradas de .NET. Cada una de estas instancias delegadas podría referir o apuntar a métodos de usuario con firma específica.

Delegado de acción: las instancias delegadas de acción podrían apuntar a métodos que toman argumentos y devuelven el vacío.

Delegado de Func: la instancia del delegado de Func podría apuntar a métodos que toman el número variable de argumentos y devuelven algún tipo.

Predicado: los predicados son similares a las instancias de delegado de func y pueden apuntar a métodos que toman una cantidad variable de argumentos y devuelven un tipo de bool.

Los otros ya han mencionado los usos correctos de los delegates específicos, pero me gustaría agregar algo que complete sus respuestas. Los nombres Func, Action, Predicate tienen antecedentes matemáticos. Para mantener las cosas simples, daré una definición informal de una función matemática como esta:

Una función es una relación entre conjuntos. Tomamos un miembro de un conjunto y lo usamos como entrada y la función asigna esta entrada a solo un miembro del otro conjunto. En otras palabras, algo obtiene entrada y produce salida.

Nuevamente, de manera informal, un predicado matemático es una afirmación que puede ser verdadera o falsa dependiendo de sus variables. Como otros han mencionado una función que devuelve boolean.

Y, por último, la acción es una función vacía (o el método matemáticamente más correcto, método o procedimiento de evasión)

Acción y 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 es más amigable con LINQ, se puede pasar como un parámetro.

Predicado no puede, tiene que ser envuelto de nuevo.

 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