706 votes

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 les méthodes qui renvoient void ?

938voto

Jason Points 11332

Tous les délégués Func retournent quelque chose ; tous les délégués Action retournent void.

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

public delegate TResult Func<TResult>()

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

public delegate void Action<T>(T obj)

Action est le délégué le plus simple, "nu" :

public delegate void Action()

Il y a aussi Func<TArg1, TResult> et Action<TArg1, TArg2> (et d'autres jusqu'à 16 arguments). Tous ces éléments (à l'exception de Action<T> ) sont nouveaux dans .NET 3.5 (définis dans System.Core).

13 votes

Pour info, la prochaine version de la bibliothèque de classes de base comprendra des types Func et Action qui prennent en charge plus de quatre paramètres formels. Je ne me souviens pas exactement de leur taille.

10 votes

En fait, on dirait qu'ils vont jusqu'à 16 dans la version 4.0.

7 votes

1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, ... cela indique clairement que le compilateur devra être capable de faire face à plus d'arguments à une fonction qu'il ne le fait actuellement à un moment donné dans le futur !

115voto

Marcel D. Lamothe Points 1797

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

Je crois Action est une solution à ce problème.

62voto

Joel Coehoorn Points 190579

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 de type, mais cet argument détermine le type de retour.

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

31voto

JaredPar Points 333733

Essayez System.Func<T> et System.Action

1 votes

Je ne pense pas que les arg 0 et autres existent dans .Net 2.0, cependant.

1 votes

C'est bizarre : Func n'existe pas du tout dans .Net 2.0, alors que Predicate et Action existent.

3 votes

Pour .NET 2.0, utilisez le délégué MethodInvoker.

8voto

Une façon très simple d'invoquer des sous-programmes avec ou sans valeur de retour est d'utiliser la commande suivante Func et Action respectivement. (voir aussi 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 votes

Merci pour cet extrait de code, qui pourrait apporter une aide limitée et immédiate. A une explication appropriée améliorerait grandement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème, et cela rendrait le document plus utile aux futurs lecteurs ayant d'autres questions similaires. S'il vous plaît modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez faites.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X