Problem
The Func delegates all produce a value. What are the delegates that can be used with void-returning functions in.NET?
Asked by Marcel Lamothe
Solution #1
All Func delegates return a value, but all Action delegates return a value of void.
TResult is returned by FuncTResult>, which accepts no parameters and returns TResult:
public delegate TResult Func<TResult>()
Action T> is a one-argument function that does not return a value:
public delegate void Action<T>(T obj)
The simplest, ‘bare’ delegate is action:
public delegate void Action()
There’s also ActionTArg1, TArg2> and FuncTArg1, TResult> (and others up to 16 arguments). Except for ActionT>, all of these are new in.NET 3.5. (defined in System.Core).
Answered by Jason
Solution #2
Action, in my opinion, is a viable solution.
Answered by Marcel Lamothe
Solution #3
That is not the case. They all take at least one type argument, but the return type is determined by that argument.
As a result, FuncT> takes no arguments and returns a value. When you don’t wish to return a value, use Action or ActionT>.
Answered by Joel Coehoorn
Solution #4
System.FuncT> and System.Action are two options.
Answered by JaredPar
Solution #5
Using Func and Action, respectively, is a relatively simple approach to invoke return and non-return value subroutines. (For more information, go to https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx.)
Consider the following example.
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());
}
}
Answered by Aarón Ibañez Werthermänn
Post is based on https://stackoverflow.com/questions/917551/func-delegate-with-no-return-type