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 Actionsia 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 Actiono 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<>.ConvertAllmetodo 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 Selectper 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 objectoltre 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());
}
}