parameter - func string c#
¿Cuál es la diferencia entre Func<string, string> y delegate? (4)
Veo a los delegados en dos formas:
A. Func<string, string> convertMethod = lambda
B. public delegate string convertMethod(string value);
No estoy seguro de cuál es realmente la diferencia entre estos dos. ¿Son ambos delegados? Creo que el primero usaría una lambda y el segundo tendría que tener un método para realizar el trabajo. También puedo estar confundido.
Antes que nada, tus dos ejemplos están haciendo dos cosas totalmente separadas. El primero es declarar una variable de delegado genérica y asignarle un valor, el segundo es simplemente definir un tipo de delegate
. Su ejemplo, más completamente, sería:
public static class Program
{
// you can define your own delegate for a nice meaningful name, but the
// generic delegates (Func, Action, Predicate) are all defined already
public delegate string ConvertedMethod(string value);
public static void Main()
{
// both work fine for taking methods, lambdas, etc.
Func<string, string> convertedMethod = s => s + ", Hello!";
ConvertedMethod convertedMethod2 = s => s + ", Hello!";
}
}
Pero más al punto, tanto Func<string,string>
como la delegate string convertMethod(string)
podrían contener las mismas definiciones de método, ya sean métodos, métodos anónimos o expresiones lambda.
En cuanto a lo que debe usar, depende de la situación. Si desea que su delegado se defina más por lo que toma y lo que vuelve, entonces los delegados genéricos son perfectos. Si desea que el delegado tenga algún nombre especial que brinde más definición de lo que debe hacer ese delegado (más allá de la simple Action
, Predicate
, etc.) entonces crear su propio delegado siempre es una opción.
Desde MSDN ,
En versiones de C # antes de 2.0, la única forma de declarar un delegado era usar métodos con nombre. C # 2.0 introdujo métodos anónimos y en C # 3.0 y versiones posteriores, las expresiones lambda reemplazan a los métodos anónimos como la forma preferida de escribir código en línea.
y
Hay un caso en el que un método anónimo proporciona una funcionalidad que no se encuentra en las expresiones lambda. Los métodos anónimos le permiten omitir la lista de parámetros. Esto significa que un método anónimo se puede convertir en delegados con una variedad de firmas.
También podría estar interesado en esta respuesta SO sobre la palabra clave delegada frente a la expresión lambda .
Además, MSDN tiene un buen artículo sobre Lambda Expressions :
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
En el ejemplo anterior, observe que la firma del delegado tiene un parámetro de entrada de tipo implícito de tipo int, y devuelve un int. La expresión lambda se puede convertir en un delegado de ese tipo porque también tiene un parámetro de entrada (x) y un valor de retorno que el compilador puede convertir implícitamente a tipo int. (La inferencia de tipo se analiza con más detalle en las siguientes secciones). Cuando se invoca al delegado utilizando un parámetro de entrada de 5, devuelve un resultado de 25.
La muestra de código que tienes está confundiendo un poco las cosas, así que déjame intentar y aclararlo. Los siguientes 2 elementos son declaraciones delegadas. Estos son fáciles de detectar porque siempre contendrán la palabra clave delegate
public delegate TReturn Func<TArg, TReturn>(Targ value);
public delegate string convertMethod(string value);
Esta línea de código asigna un valor a un local que se escribe a un delegado
Func<string, string> local = lambda;
El código anterior no se limita a usar solo lambdas. El valor también podría ser un grupo de métodos compatible u otro valor de delegado.
Otro elemento a tener en cuenta es que aunque Func<string, string>
y convertMethod
son delegados con firmas idénticas, sus valores no son convertibles entre sí. Por ejemplo, lo siguiente es ilegal
Func<string, string> local1 = ...;
convertMethod local2 = local1; // Error!!!
A inicializa una instancia de un delegado (que se puede llamar de inmediato). Es una variable de tipo Func <string, string>.
B especifica la definición de un delegado (su firma). Se puede usar para definir posteriormente variables de tipo convertMethod .