Veo 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. ¿Ambos son delegados? Creo que el primero usaría una lambda y el segundo tendría que tener un método para realizar el trabajo. Yo también puedo estar confundido.
Respuestas:
En primer lugar, sus dos ejemplos están haciendo dos cosas totalmente separadas. El primero es declarar una variable delegada genérica y asignarle un valor, el segundo es simplemente definir un
delegate
tipo. Su ejemplo, más completo, 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 concretamente, ambos
Func<string,string>
ydelegate string convertMethod(string)
serían capaces de contener las mismas definiciones de método, ya sean métodos, métodos anónimos o expresiones lambda.En cuanto a cuál debe utilizar, depende de la situación. Si desea que su delegado se defina más por lo que toma y devuelve, entonces los delegados genéricos son perfectos. Si desea que el delegado tiene un nombre especial que le da una mayor definición de lo que el delegado debe hacer (más allá del simple
Action
,Predicate
, etc), entonces la creación de su propio delegado es siempre una opción.fuente
Func<int, string>
, que muestra que la forma esFunc<arg1, result>
.La muestra de código que tiene confunde un poco las cosas, así que déjeme intentar aclararlo. Los siguientes 2 elementos son declaraciones de delegados. Estos son fáciles de detectar porque siempre contendrán la
delegate
palabra clavepublic 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;
Sin embargo, 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 delegado.
Otro elemento a destacar es que a pesar de que
Func<string, string>
yconvertMethod
son ambos delegados con firmas idénticas son sus valores no convertibles entre sí. Por ejemplo, lo siguiente es ilegalFunc<string, string> local1 = ...; convertMethod local2 = local1; // Error!!!
fuente
Desde MSDN ,
y
También puede 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 Expresiones Lambda :
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 }
fuente
A inicializa una instancia de un delegado (que se puede llamar inmediatamente). Es una variable de tipo Func <string, string>.
B especifica la definición de delegado (su firma). Se puede utilizar para definir posteriormente variables de tipo convertMethod .
fuente