All Func delegates return something; all the Action delegates return void.
Func<TResult>
takes no arguments and returns TResult:
public delegate TResult Func<TResult>()
Action<T>
takes one argument and does not return a value:
public delegate void Action<T>(T obj)
Action
is the simplest, 'bare' delegate:
public delegate void Action()
There's also Func<TArg1, TResult>
and Action<TArg1, TArg2>
(and others up to 16 arguments). All of these (except for Action<T>
) are new to .NET 3.5 (defined in System.Core).
... takes no arguments and has a void return type?
I believe Action
is a solution to this.
All of the Func delegates take at least one parameter
That's not true. They all take at least one type argument, but that argument determines the return type.
So Func<T>
accepts no parameters and returns a value. Use Action
or Action<T>
when you don't want to return a value.
Try System.Func<T>
and System.Action
Converter<TInput, TOutput>
which was like the later Func<T, TResult>
. It was used in the List<>.ConvertAll
method which projected every element in a List<>
onto another object, and placed all the "function values" in a new List<>
. (Later, one would often use Linq Select
for that.)
A very easy way to invoke return and non return value subroutines. is using Func and Action respectively. (see also https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx)
Try this this 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());
}
}
Occasionally you will want to write a delegate for event handling, in which case you can take advantage of System.EvenHandler<T>
which implicitly accepts an argument of type object
in addition to the second parameter that should derive from EventArgs
. EventHandlers will return void
I personally found this useful during testing for creating a one-off callback in a function body.
... takes no arguments and has a void return type?
If you are writing for System.Windows.Forms
, You can also use:
public delegate void MethodInvoker()
Success story sharing
Func<,,, ... ,>
) in .NET 4.0, but the last eight types of each "series" are defined inSystem.Core.dll
, not inmscorlib.dll
, so that would be the reason why michielvoo didn't see them. However, no more Funcs or Actions were added in .NET versions 4.5 and 4.5.1. Will this sequence become A170836 or A170875? Stay tuned.