2009-08-21 12 views

Respuesta

23

Suponga 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, siendo el primero el tipo del primer parámetro, el segundo es el tipo de retorno. Como tal, se podría 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 delegados personalizados. Esto hace que sea mucho más fácil interoperar delegados con la misma firma.

decir que he tenido:

public delegate string MyDelegate1(string s); 
public delegate string MyDelegate2(string s); 

MyDelegate1 myDel = new MyDelegate1(toLower); // toLower as above 

ya no hay ninguna manera de conver mi delegado MyDelegate1 a un objeto de tipo MyDelegate2, a pesar de que tienen la misma firma del método. Por otro lado, si se hubiera utilizado Func en lugar de declarar un tipo de delegado costumbre, no tendríamos este problema

5

System.Func<T> se utiliza por lo general como un argumento a otra función. Puede ser cualquier delegado que devuelva un valor de T, y hay múltiples versiones para usar como delegado con múltiples argumentos.

Un uso común es para filtrar; 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, debería expresiones lambda uso más probables para construir el Func<string,bool> sobre la marcha, como:

var stringsStartingWithR = strings.Where(s => s.StartsWith("R")); 
+0

Técnicamente, .Where() pide un delegado de predicados. Pero dado que ese es solo un caso especial de Func, estás bien. –

+4

Joel: No es así. Enumerable.Where (Of (TSource)) (IEnumerable (Of (TSource)), Func (Of (TSource, Boolean))) Vea: http://msdn.microsoft.com/en-us/library/system.linq. enumerable.where.aspx –

+0

Específicamente lo ha definido como Func

2
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; 
} 
0

Se usa para representar cualquier tipo de delegado que tiene un valor de retorno.

1

1) Cree una instancia de Func que tenga un parámetro y un valor de retorno. 2) Instancia de Func con dos parámetros y un resultado. Recibe bool y int, devuelve cadena. 3) Instancia de Func que no tiene parámetros y un valor de resultado. 4) Llame al método de instancia Invoke en las funciones anónimas.

usando Sistema; class Program {static void Main() {

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()); } } 
Cuestiones relacionadas