Question Délégué Func sans type de retour


Tous les délégués Func renvoient une valeur. Quels sont les délégués .NET qui peuvent être utilisés avec des méthodes qui retournent void?


452
2018-05-27 19:21


origine


Réponses:


Tous les délégués Func renvoient quelque chose; tous les délégués Action retournent le vide.

Func<TResult> ne prend aucun argument et renvoie TResult:

public delegate TResult Func<TResult>()

Action<T> prend un argument et ne renvoie pas de valeur:

public delegate void Action<T>(T obj)

Action est le délégué le plus simple:

public delegate void Action()

Il y a aussi Func<TArg1, TResult> et Action<TArg1, TArg2> (et d'autres jusqu'à 16 arguments). Tout cela (sauf pour Action<T>) sont nouveaux pour .NET 3.5 (définis dans System.Core).


597
2018-05-27 19:24



... ne prend aucun argument et a un type de retour nul?

Je crois Action est une solution à cela.


55
2018-05-27 19:23



Tous les délégués Func prennent au moins un paramètre

Ce n'est pas vrai. Ils prennent tous au moins un argument type, mais cet argument détermine le type de retour.

Alors Func<T> n'accepte aucun paramètre et renvoie une valeur. Utilisation Action ou Action<T> lorsque vous ne voulez pas renvoyer de valeur


41
2018-05-27 19:23



Essayer System.Func<T> et System.Action


25
2018-05-27 19:22



Parfois, vous voudrez écrire un délégué pour la gestion des événements, auquel cas vous pourrez profiter de System.EvenHandler<T> qui accepte implicitement un argument de type object en plus du deuxième paramètre qui devrait dériver de EventArgs. EventHandlers reviendra void

J'ai personnellement trouvé cela utile lors des tests pour créer un rappel unique dans un corps de fonction.


0
2017-10-19 18:04



... ne prend aucun argument et a un type de retour nul?

Si vous écrivez pour System.Windows.Forms, Vous pouvez aussi utiliser:

public delegate void MethodInvoker()

0
2018-02-25 18:40



Un moyen très simple d'invoquer des sous-programmes de retour et de non-retour. utilise Func et action respectivement. (voir également https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx) 

Essayez cet exemple

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

-2
2018-01-25 17:06