Functions
There are two ways to define anonymous functions in C#
:
- Delegates, which take a list of arguments greater than or equal to 0 and have a return type
- Actions, which take a list of arguments greater than or equal to 0 and have no return type
Delegate
You can define an anonymous delegate function with a return type by using the Func
object. Func
takes some number of arguments and returns something. When declaring a Func
you should follow it by < >
angle brackets with the input argument type and return type. You can use standard lambda calculus syntax to define anonymous functions.
Func<int, int> Double = x => x * 2
Func<int> Three = () => 3 // delegate that takes no arguments
You can use lexical scopes with delegates.
var y = 20;
Func<int, int> Product = x =>
{
// y contained in the lexical scope of Product
return x * y;
};
Product(10); // => 200
You can define a function that takes another function with a return type as an argument by using the Func
delegate object. Func
delegates define inputs in the <>
angle brackets at definition with the last type definition in the angle brackets being the output type. In the example below MyFunc
is a delegate that takes an int
and returns an int
.
public void RunThis(int[] arr, Func<int, int> MyFunc)
{
foreach(int i in arr)
{
var result = MyFunc(i);
Console.WriteLine(result);
}
}
int[] arr = new int[] {1, 2, 3, 4, 5};
RunThis(arr, x => x * 2); // => 2, 4, 6, 8, 10
Action
Many of the rules that apply to delegates also apply to actions, so unless functionality is specifically stated assume that they overlap.
You can define an anonymous function without a return type by using the Action
. Action
takes some number of arguments are returns void
. You can define an Action
by using the Action
type followed by < >
angle brackets with the argument types in them.
Action<int> EchoInt = i => Console.WriteLine(i);
Splat Arguments
You can pass multiple arguments to a function using the param
keyword and then accessing the arguments as an array.
void EchoNumbers(params int[] foo)
{
foreach(int i in foo)
{
Console.WriteLine(i);
}
}
EchoNumbers(1, 2, 3);
// => 1
// => 2
// -> 3