Todos los delegados de Func devuelven un valor. ¿Cuáles son los delegados .NET que se pueden usar con métodos que devuelven vacío?
Todos los delegados de Func devuelven un valor. ¿Cuáles son los delegados .NET que se pueden usar con métodos que devuelven vacío?
Respuestas:
Todos los delegados de Func devuelven algo; Todos los delegados de acción vuelven sin efecto.
Func<TResult>
no toma argumentos y devuelve TResult:
public delegate TResult Func<TResult>()
Action<T>
toma un argumento y no devuelve un valor:
public delegate void Action<T>(T obj)
Action
es el delegado 'simple' más simple:
public delegate void Action()
También hay Func<TArg1, TResult>
y Action<TArg1, TArg2>
(y otros hasta 16 argumentos). Todos estos (excepto Action<T>
) son nuevos en .NET 3.5 (definido en System.Core).
Func<,,, ... ,>
) en .NET 4.0, pero los últimos ocho tipos de cada "serie" se definen en System.Core.dll
, no en mscorlib.dll
, así que esa sería la razón por qué michielvoo no los vio. Sin embargo, no se agregaron más Funcs o Actions en .NET versiones 4.5 y 4.5.1. ¿Esta secuencia se convertirá en A170836 o A170875 ? Manténganse al tanto.
... no toma argumentos y tiene un tipo de retorno nulo?
Creo que Action
es una solución a esto.
Todos los delegados de Func toman al menos un parámetro
Eso no es cierto. Todos toman al menos un argumento de tipo, pero ese argumento determina el tipo de retorno.
Entonces Func<T>
no acepta parámetros y devuelve un valor. Use Action
o Action<T>
cuando no desee devolver un valor.
Intenta System.Func<T>
ySystem.Action
Converter<TInput, TOutput>
que era como el posterior Func<T, TResult>
. Se usó en el List<>.ConvertAll
método que proyectaba cada elemento en un List<>
sobre otro objeto, y colocaba todos los "valores de función" en un nuevo List<>
. (Más tarde, a menudo se usaría Linq Select
para eso.)
Ocasionalmente, querrá escribir un delegado para el manejo de eventos, en cuyo caso puede aprovechar System.EvenHandler<T>
que acepta implícitamente un argumento de tipo object
además del segundo parámetro del que debe derivarse EventArgs
. EventHandlers volverávoid
Personalmente, esto me pareció útil durante las pruebas para crear una devolución de llamada única en un cuerpo de función.
... no toma argumentos y tiene un tipo de retorno nulo?
Si está escribiendo para System.Windows.Forms
, también puede usar:
public delegate void MethodInvoker()
Una forma muy fácil de invocar subrutinas de valor de retorno y no retorno. está utilizando Func y Action respectivamente. (ver también https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )
Prueba este ejemplo
using System;
public class Program
{
private Func<string,string> FunctionPTR = null;
private Func<string,string, string> FunctionPTR1 = null;
private Action<object> ProcedurePTR = null;
private string Display(string message)
{
Console.WriteLine(message);
return null;
}
private string Display(string message1,string message2)
{
Console.WriteLine(message1);
Console.WriteLine(message2);
return null;
}
public void ObjectProcess(object param)
{
if (param == null)
{
throw new ArgumentNullException("Parameter is null or missing");
}
else
{
Console.WriteLine("Object is valid");
}
}
public void Main(string[] args)
{
FunctionPTR = Display;
FunctionPTR1= Display;
ProcedurePTR = ObjectProcess;
FunctionPTR("Welcome to function pointer sample.");
FunctionPTR1("Welcome","This is function pointer sample");
ProcedurePTR(new object());
}
}