Tutti i delegati di Func restituiscono un valore. Quali sono i delegati .NET che possono essere utilizzati con metodi che restituiscono nulla?
Tutti i delegati di Func restituiscono un valore. Quali sono i delegati .NET che possono essere utilizzati con metodi che restituiscono nulla?
Risposte:
Tutti i delegati di Func restituiscono qualcosa; tutti i delegati dell'Azione ritornano nulli.
Func<TResult>
non accetta argomenti e restituisce TResult:
public delegate TResult Func<TResult>()
Action<T>
accetta un argomento e non restituisce un valore:
public delegate void Action<T>(T obj)
Action
è il delegato più semplice, "nudo":
public delegate void Action()
C'è anche Func<TArg1, TResult>
e Action<TArg1, TArg2>
(e altri fino a 16 argomenti). Tutti questi (ad eccezione di Action<T>
) sono nuovi a .NET 3.5 (definito in System.Core).
Func<,,, ... ,>
) in .NET 4.0, ma gli ultimi otto tipi di ogni "serie" sono definiti in System.Core.dll
, non in mscorlib.dll
, quindi questo sarebbe il motivo perché michielvoo non li ha visti. Tuttavia, non sono stati aggiunti altri Func o azioni nelle versioni .NET 4.5 e 4.5.1. Questa sequenza diventerà A170836 o A170875 ? Rimanete sintonizzati.
... non accetta argomenti e ha un tipo di ritorno vuoto?
Credo Action
sia una soluzione a questo.
Tutti i delegati di Func accettano almeno un parametro
Non è vero. Prendono tutti almeno un argomento di tipo, ma quell'argomento determina il tipo di ritorno.
Quindi Func<T>
non accetta parametri e restituisce un valore. Utilizzare Action
o Action<T>
quando non si desidera restituire un valore.
Prova System.Func<T>
eSystem.Action
Converter<TInput, TOutput>
simile a quello successivo Func<T, TResult>
. È stato utilizzato nel List<>.ConvertAll
metodo che ha proiettato ogni elemento in a List<>
su un altro oggetto e ha inserito tutti i "valori di funzione" in un nuovo List<>
. (Più tardi, si userebbe spesso Linq Select
per quello.)
Occasionalmente vorrai scrivere un delegato per la gestione degli eventi, nel qual caso puoi trarne vantaggio System.EvenHandler<T>
accettando implicitamente un argomento di tipo object
oltre al secondo parametro da cui dovrebbe derivare EventArgs
. EventHandlers torneràvoid
Personalmente l'ho trovato utile durante i test per la creazione di un callback unico in un corpo di funzione.
... non accetta argomenti e ha un tipo di ritorno vuoto?
Se stai scrivendo per System.Windows.Forms
, puoi anche usare:
public delegate void MethodInvoker()
Un modo molto semplice per invocare subroutine di valore di ritorno e non di ritorno. sta usando rispettivamente Func e Action . (vedi anche https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )
Prova questo esempio
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());
}
}