c# .net

c# - Delegado funcional sin tipo de retorno



.net (7)

Todos los delegados funcionales devuelven un valor. ¿Qué son los delegados de .NET que se pueden usar con métodos que devuelven el vacío?


... no toma argumentos y tiene un tipo de retorno nulo?

Creo que la Action es una solución para esto.


... 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()


Todos los delegados funcionales 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.

So Func<T> no acepta parámetros y devuelve un valor. Use Action o Action<T> cuando no quiera devolver un valor.


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 que debe derivarse de EventArgs . EventHandlers devolverán void

Personalmente, me pareció útil durante las pruebas para crear una devolución de llamada única en el cuerpo de una función.


Prueba System.Func<T> y System.Action


Todos los delegados funcionales devuelven algo; Todos los delegados de Acción vuelven nulos.

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 más simple, "desnudo":

public delegate void Action()

También hay Func<TArg1, TResult> y Action<TArg1, TArg2> (y otros hasta 16 argumentos). Todos estos (excepto para Action<T> ) son nuevos para .NET 3.5 (definido en System.Core).


Una forma muy fácil de invocar subrutinas de valor de retorno y sin retorno. está usando Func y Action respectivamente. (vea 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()); } }