Func<>
es un delegado genérico, es muy conveniente de usar, porque no tiene que crear su propio delegado para cada combinación de argumento/tipo de retorno.
Anteriormente, había que escribir algo como:
public delegate long MyDelegate(int number);
public void Method(IEnumerable<int> list, MyDelegate myDelegate)
{
foreach(var number in list)
{
myDelegate(number);
}
}
Había que publicar su delegado para que un usuario puede llamar a su método correctamente. Especialmente cuando necesita un grupo de delegados diferentes, terminó publicando uno para cada lista de argumentos y tipo de devolución.
Con Func<>
que acaba de escribir:
public void Method(IEnumerable<int> list, Func<int, long> myDelegate)
{
foreach(var number in list)
{
myDelegate(number);
}
}
significa lo mismo como el primer ejemplo de código - Func<int, long>
define un delegado que toma un argumento entero y devuelve un valor de largo.
Por supuesto se puede utilizar listas de parámetros más largos, también: Func<int, int, bool, long>
todavía volverá mucho valor mientras que se requieren dos enteros y un valorbool. Si desea un delegado sin valor devuelto, deberá usar Action<>
, que tendrá void como tipo de devolución.
EDITAR (por petición): cómo llamar al método en mi ejemplo:
Para la persona que llama, no hay diferencia entre la solución con MyDelegate
o Func<>
. En ambos casos se dispone de tres opciones para llamar al método:
Utilizando una notación lambda (C# 3.0 requerido, probablemente la mejor solución para los métodos cortos):
Method(myList, i => i * i);
Mediante el uso de un método anónimo (C# 2.0 requerido):
Method(myList, delegate(int i)
{
return i * i;
});
o utilizando un método real como un argumento:
Method(myList, Square);
private static long Square(int number)
{
return number * number;
}
El libro de Jon Skeet sobre c sharp tiene unos excelentes capítulos sobre esto y por qué es tan importante para las funciones lambda y linq. –
No hay nada de miedo ni razón para evitar, Func o delegados genéricos: simplemente son delegados que representan métodos generales que toman una cierta cantidad de argumentos. – thecoop
Es posible que desee consultar las diversas preguntas de Func en SO: http://stackoverflow.com/questions/tagged/func –