Reputation: 12882
All of the Func<T>
delegates return a value. What are the .NET delegates that can be used with methods that return void
?
Upvotes: 710
Views: 309423
Reputation: 121
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());
}
}
Upvotes: 8
Reputation: 3409
... 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()
Upvotes: 1
Reputation: 28590
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).
Upvotes: 944
Reputation: 41092
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.
Upvotes: 1
Reputation: 12882
... takes no arguments and has a void return type?
I believe Action
is a solution to this.
Upvotes: 117
Reputation: 415600
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.
Upvotes: 62