2009-05-27 11 views

Respuesta

561

Todos los delegados de Func devuelven algo; todos los delegados de Acción devuelven el vacío.

Func<TResult> no tiene 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 más simple, delegado 'desnuda':

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

+8

FYI, la próxima versión de la biblioteca de clases base incluirá Func y tipos de acciones que admiten más de cuatro parámetros formales. No recuerdo exactamente lo grande que se ponen. –

+0

No había escuchado eso, ¡gracias por la información de Eric! –

+66

En .NET 4.0, ahora suben a 8 parámetros. Si continúan así, ¡en la próxima versión subirán a once! 11! –

23

Trate System.Func<T> y System.Action

+1

no creo que existan las 0 arg y otras cosas en .Net 2.0, sin embargo. – Brian

+1

Es extraño: Func no existe en .Net 2.0, aunque Predicate y Action lo hacen. –

+2

Para .NET 2.0 use el delegado de MethodInvoker. –

49

... no tiene argumentos y tiene un tipo de retorno void?

Creo que Action es una solución a esto.

38

Todos los delegados Func tomar por lo menos un parámetro

eso no es verdad. 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.

0

vez en cuando se desee escribir un delegado para la gestión de eventos, en cuyo caso se puede tomar ventaja de System.EvenHandler<T> que implícitamente acepta un argumento de tipo object además del segundo parámetro que debe derivar de EventArgs. EventHandlers devolverá void

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

-2

Una forma muy fácil de invocar subrutinas de valor devuelto y no devuelto. está utilizando Func y Acción respectivamente. (ver también https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx)

probar 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()); 
    } 
} 
+0

Gracias por este fragmento de código, que podría proporcionar alguna ayuda limitada e inmediata. Una [explicación adecuada mejoraría en gran medida su valor a largo plazo] (// meta.stackexchange.com/q/114762/350567) al mostrar * por qué * esta es una buena solución al problema y lo haría más útil para el futuro lectores con otras preguntas similares. Por favor [edite] su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho. – iBug

0

... no tiene argumentos y tiene un tipo de retorno void?

Si usted está escribiendo para System.Windows.Forms, También puede utilizar:

public delegate void MethodInvoker() 
Cuestiones relacionadas