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 renvoient void?
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 renvoient void?
Réponses:
Tous les délégués Func retournent quelque chose; tous les délégués à l'action reviennent nuls.
Func<TResult>
ne prend aucun argument et retourne 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 et «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 pour .NET 3.5 (définis dans System.Core).
Func<,,, ... ,>
) dans .NET 4.0, mais les huit derniers types de chaque "série" sont définis dans System.Core.dll
, pas dans mscorlib.dll
, donc ce serait la raison pourquoi michielvoo ne les a pas vus. Cependant, plus de Funcs ou d'actions n'ont été ajoutés dans les versions .NET 4.5 et 4.5.1. Cette séquence deviendra-t-elle A170836 ou A170875 ? Restez à l'écoute.
... ne prend aucun argument et a un type de retour vide?
Je crois que Action
c'est une solution à cela.
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.
Func<T>
N'accepte donc aucun paramètre et renvoie une valeur. Utilisez Action
ou Action<T>
lorsque vous ne souhaitez pas renvoyer de valeur.
Essayez System.Func<T>
etSystem.Action
Converter<TInput, TOutput>
qui était comme le dernier Func<T, TResult>
. Il a été utilisé dans la List<>.ConvertAll
méthode qui projetait chaque élément d'un dans un List<>
autre objet et plaçait toutes les "valeurs de fonction" dans un nouveau List<>
. (Plus tard, on utilise souvent Linq Select
pour cela.)
Parfois, vous souhaiterez écrire un délégué pour la gestion des événements, auquel cas vous pouvez profiter de System.EvenHandler<T>
ce qui accepte implicitement un argument de type object
en plus du deuxième paramètre qui doit dériver EventArgs
. EventHandlers reviendravoid
Personnellement, j'ai trouvé cela utile lors des tests de création d'un rappel unique dans un corps de fonction.
... ne prend aucun argument et a un type de retour vide?
Si vous écrivez pour System.Windows.Forms
, vous pouvez également utiliser:
public delegate void MethodInvoker()
Un moyen très simple d'appeler des sous-programmes de valeur de retour et de non-retour. utilise respectivement Func et Action . (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());
}
}