2009-02-19 19 views
106

Puede alguien dar una buena explicación (esperemos que con ejemplos) de estos 3 delegados más importantes:Delegados: Predicado Acción Func

  • predicado
  • Acción
  • Func

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

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

Respuesta

158
  • Predicate: esencialmente Func<T, bool>; hace la pregunta "¿el argumento especificado satisface la condición representada por el delegado?" Usado en cosas como List.FindAll.

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

  • Func: Usado ampliamente en LINQ, por lo general para transformar el argumento, p. proyectando una estructura compleja a una propiedad.

Otros delegados importantes:

  • EventHandler/EventHandler<T>: Se utiliza en todo WinForms

  • Comparison<T>: Al igual que IComparer<T> pero en forma delegado.

+2

También hay 'System.Converter ', aunque rara vez se usa. –

+3

El convertidor es un buen delegado cuando se necesitan muchas clases de conversión de modelos en negocios, es decir, http://www.stum.de/2009/12/23/using-a-converter-to-convert-from-a -model-a-a-business-class/ –

+0

'EventHandler/EventHandler ' aparecen fuera de WinForms también. – Andy

8

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

  • Converter<TInput, TOutput>: Básicamente se trata de Func<TInput, TOutput>, pero con la semántica. Utilizado por List.ConvertAll y Array.ConvertAll, pero personalmente no lo he visto en ningún otro lado.
4

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.

3

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 de delegado de acción podrían indicar métodos que toman argumentos y devuelven el vacío.

Delegado de Func - La instancia de delegado de Func podría apuntar a método (s) que toman el número de argumentos variable 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 un número variable de argumentos y devuelven un tipo de bool.

23

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

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<T1,T2,T3,TResult>, aquí T1, T2, T3 son parámetros de entrada y TResult es la salida del mismo.

Predicate: Predicate también es una forma de Func pero siempre devolverá bool. En palabras simples, es envoltorio de Func<T,bool>.

2

Los otros ya han mencionado los usos correctos de los delegados 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, informalmente, un predicado matemático es una declaració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 void (o el método más matemáticamente correcto nombre -void o procedimiento)

1

Acción y Func con lambda:

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