examples - C#- delegado System.Func<>
func string c# (5)
Úselo para representar cualquier tipo de delegado que tenga un valor de retorno.
¿Cómo usar delegado System.Func <>? ¿Debemos controlar el orden de ejecución de la función o los eventos que lo utilizan?
un simple ejemplo sería útil
1) Cree una instancia de Func que tenga un parámetro y un valor de retorno. 2) Instancia funcional con dos parámetros y un resultado. Recibe bool e int, devuelve cadena. 3) Instancia funcional que no tiene parámetros y un valor de resultado. 4) Llame al método de instancia Invoke en las funciones anónimas.
utilizando el sistema; programa de clase {estático vacío principal () {
Func<int, string> func1 = (x) => string.Format("string = {0}", x);
Func<bool, int, string> func2 = (b, x) =>
string.Format("string = {0} and {1}", b, x);
Func<double> func3 = () => Math.PI / 2;
Console.WriteLine(func1.Invoke(10));
Console.WriteLine(func2.Invoke(true, 20));
Console.WriteLine(func3.Invoke()); } }
Supongamos que tiene una función como:
private static string toLower(string s)
{
return s.ToLower();
}
Hay una versión de System.Func que toma dos argumentos genéricos, el primero es el tipo del primer parámetro, el segundo es el tipo de retorno. Como tal, podrías escribir:
Func<string,string> myFunction = toLower;
string s = myFunction("AsDf");
// s is now "asdf"
En todas las versiones de System.Func, el último argumento genérico es el tipo de retorno, todos los demás son los tipos de los parámetros, en orden.
System.Func es útil porque no requiere que escriba tipos de delegado personalizados. Esto facilita mucho la interoperabilidad de delegados con la misma firma.
Di que tuve:
public delegate string MyDelegate1(string s);
public delegate string MyDelegate2(string s);
MyDelegate1 myDel = new MyDelegate1(toLower); // toLower as above
Ahora no hay forma de convertir mi delegado MyDelegate1 en un objeto de tipo MyDelegate2, aunque tengan la misma firma de método. Por otro lado, si hubiéramos usado Func en lugar de declarar un tipo de delegado personalizado, no tendríamos este problema
System.Func<T>
se usa generalmente como un argumento para otra función. Puede ser cualquier delegado que devuelva un valor de T, y existen varias versiones para usar como un delegado con múltiples argumentos.
Un uso común es para el filtrado; por ejemplo, en LINQ, puede pasar una función para usar como filtro en la función Enumerable.Where, para restringir una colección. Por ejemplo:
public bool FilterByName(string value)
{
return value.StartsWith("R");
}
// .. later
List<string> strings = new List<string> { "Reed", "Fred", "Sam" };
var stringsStartingWithR = strings.Where(FilterByName);
Sin embargo, en el caso anterior, es más probable que uses expresiones lambda para construir Func<string,bool>
sobre la marcha, como:
var stringsStartingWithR = strings.Where(s => s.StartsWith("R"));
void Foo()
{
Func<object, bool> func = Bar;
bool b1 = func(new object()); // b1 is true
bool b2 = func(null); // b2 is false
}
bool Bar(object o)
{
return o == null;
}