¿Hay alguna razón para usar un Func sobre un método?

7

Hace poco empecé a ver Func en C #, y por lo que puedo decir, casi son lo mismo que los métodos, lo cual es bastante justo. Sin embargo, me preguntaba si tendría algún sentido usarlos, porque, por lo que puedo decir, parecen ser solo una versión ligeramente menor de los métodos. Considera lo siguiente:

Func<int,int> SquareTheNumber = x => { return x * x };
public int ReturnTheSquare (int x)
{
    return x * x;
}

Entonces, ¿hay alguna instancia en la que se deba usar Func sobre un método?

    
pregunta Danny Goodall 11.05.2016 - 10:46

2 respuestas

14

Un Func es solo un tipo especial de delegado (bueno, una familia de). Naturalmente, C # estaría completamente completo incluso sin ellos, por lo que, por supuesto, nadie los "necesita", es solo que hacen muchas cosas MUCHO más simples en cuanto a diseño y sintaxis.

Asumen un rol similar al de los punteros de función en lenguajes como C. Es básicamente una forma de desacoplarte de un método específico y, en cambio, depender de una clase polimórfica ("clase" en un sentido no OOP) de métodos.

Un ejemplo bastante simple cuando son útiles es el método map en el functor IEnumerable<T> (llamado Select en C #):

public static IEnumerable<TResult> Select<T, TResult>(this IEnumerable<T> xs, Func<T, TResult> f)
{
    foreach (var x in xs) yield return f(x);
}

Ahora se puede llamar a través de new[] {1,2,3}.Select(x => x*2) en lugar de definir una interfaz de un solo método y crear una clase completa solo para multiplicar un número por 2.

Nombrar y colocar explícitamente a cada pequeño lambda en una clase en un espacio de nombres simplemente hincharía las cosas y no agregaría claridad.

    
respondido por el sara 11.05.2016 - 11:10
5
  

Hace poco empecé a ver Func en C # y, por lo que puedo decir, casi son lo mismo que los métodos, lo cual es bastante justo.

Func s (y Action s) son objetos. Los métodos no son.

En un lenguaje orientado a objetos, donde todo lo que haces se hace manipulando, construyendo, pasando, devolviendo y almacenando objetos, algo que no es un objeto extremadamente restricción severa. Entonces, no, son no "más o menos iguales", en realidad son fundamentalmente diferentes. En cierto sentido, no podrían ser más diferentes.

  • Puedes pasar un Func como argumento. No puedes hacer eso con un método, porque solo puedes pasar objetos, ya que los argumentos y los métodos no son objetos.
  • Puedes devolver un Func . No puedes hacer eso con un método, porque solo puedes devolver objetos y los métodos no son objetos.
  • Puedes asignar un Func a una variable. No puedes hacer eso con un método, porque solo puedes asignar objetos a variables y los métodos no son objetos.
  • Puedes construir un Func en tiempo de ejecución. No puedes hacer eso con un método.

[Estoy ignorando la reflexión aquí. También estoy ignorando la conversión automática de las referencias del grupo de métodos a los delegados.]

    
respondido por el Jörg W Mittag 11.05.2016 - 13:11

Lea otras preguntas en las etiquetas