Delegado de Func sin tipo de retorno

Todos los delegados de Func devuelven un valor. ¿Cuáles son los delegados de .NET que se pueden usar con métodos que devuelven void?

preguntado el 27 de mayo de 09 a las 16:05

7 Respuestas

Todos los delegados de Func devuelven algo; todos los delegados de Acción regresan vacíos.

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 'desnudo' 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 (definidos en System.Core).

Respondido el 04 de diciembre de 17 a las 17:12

Para su información, la próxima versión de la biblioteca de clases base incluirá los tipos Func y Action que admiten más de cuatro parámetros formales. No recuerdo exactamente qué tan grandes se vuelven. - eric lippert

En realidad, parece que suben a 16 en 4.0. - Tustin2121

1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, ... esto indica claramente que el compilador deberá poder hacer frente a más argumentos para una función de los que tiene actualmente en algún momento en el futuro! - Chris Morgan

En realidad, Tustin2121 tiene razón, subieron a 16 parámetros (más un tipo de retorno en el caso de 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 la que michielvoo no los vio. Sin embargo, no se agregaron más funciones o acciones en las versiones .NET 4.5 y 4.5.1. ¿Esta secuencia se convertirá en A170836 or A170875? Manténganse al tanto. - Jeppe Stig Nielsen

Consigo proporcionar algunas sobrecargas con varios argumentos por conveniencia, pero en cierto punto, simplemente envuelva sus argumentos en un objeto ... - Brian Sweeney

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

Creo que Action es una solución a esto.

respondido 16 mar '12, 12:03

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.

So Func<T> no acepta parámetros y devuelve un valor. Usar Action or Action<T> cuando no desea devolver un valor.

contestado el 27 de mayo de 09 a las 20:05

Trata System.Func<T> y System.Action

contestado el 27 de mayo de 09 a las 20:05

Sin embargo, no creo que el 0 arg y demás existan en .Net 2.0. - Brian

Es extraño: Func no existe en absoluto en .Net 2.0, aunque Predicate y Action sí. - Joel Coehoorn

Para .NET 2.0 use el delegado MethodInvoker. - Trevor Elliott

.NET 2 también tenía (o tiene) un tipo de delegado Converter<TInput, TOutput> que fue como el ultimo Func<T, TResult>. Fue utilizado en el List<>.ConvertAll método que proyectaba cada elemento en un List<> en otro objeto, y colocó todos los "valores de función" en un nuevo List<>. (Más tarde, a menudo se usaría Linq Select para eso.) - Jeppe Stig Nielsen

Una forma muy sencilla de invocar subrutinas de valor de devolución y no devolución. esta usando Func y Acción respectivamente. (Véase también https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx)

Prueba este 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());
    }  
}

respondido 06 mar '18, 00:03

Gracias por este fragmento de código, que puede proporcionar ayuda inmediata y limitada. A una explicación adecuada mejoraría enormemente su valor a largo plazo mostrando el porqué esta es una buena solución al problema y la haría más útil para futuros lectores con otras preguntas similares. Por favor editar su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho. - iBug

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 derivar de EventArgs. EventHandlers volverá void

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

Respondido 19 Oct 16, 19:10

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

Si estas escribiendo para System.Windows.Forms, También puedes usar:

public delegate void MethodInvoker()

Respondido 25 Feb 18, 18:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.