Func and Action

A delegate is a reference type that is used to encapsulates an anonymous or named method.

This is the way of C# uses to allow the creation of high order functions and to turn possible treat methods as a first class member.

There's a lot of delegates embedded in C# language, but two of them are very important for functional development and for Tango.

They are: Func and Action delegates.

These two delegates can be used to represents any method presents in your code, with a single, but very important difference.

The Func delegate is only capable of encapsulate methods that creates a result, that is, all methods needs to return a new value.

While the Action delegate is capable of encapsulate methods that don't creates a result, that is, void methods.

There´s a lot of overloads of these two delegates in order to coverage any quantity of parameters, from 0 to 16.

For instance, see how Func delegates can be used to store a method:

Func<int,int,int> Add = (number1, number2) => number1 + number2;

Because of its overloads these delegates can be use to represents a lot of different methods.

In this next sample, an bool method will be encapsulated:

Func<int,bool> IsEven = number => number % 2 == 0;

Notice that the last type passed to generics in `Func 'delegate represents the type of value returned by the function, and the previous ones are used to represent the types of each parameter respectively.

The same occurs to the Action delegate, but at this time we have no return.

Action<double> WriteNumber = number => Console.WriteLine(number);

The System.Linq namespace, uses a lot of this concept to create powerful high order functions, like the Tango do. In order to create high order functions to improve your code, turning it more expressive and clean.

Last updated