# 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:

```csharp
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:

```csharp
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.

```csharp
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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gabriel-schade-cardoso.gitbook.io/tango/fundamentals/function-and-action.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
