En primer lugar, sus 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 delegate
. 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!";
}
}
embargo, más al punto, tanto Func<string,string>
y delegate string convertMethod(string)
sería capaz de mantener las mismas definiciones de métodos ya sean métodos, métodos anónimos, o expresiones lambda.
En cuanto a lo que debe utilizar, 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á del simple Action
, Predicate
, etc.) entonces crear su propio delegado siempre es una opción.
posible duplicado de [Declarar delegado manualmente, utilice Func o Acción ?] (Http://stackoverflow.com/questions/4482613/declare-delegate-manually-use-funct -or-actiont) –
nawfal