Oui, C# prend en charge que. Il existe plusieurs syntaxes disponibles:
-
Les méthodes anonymes (disponible à partir de C# 2 à partir)
Func<int, int, int> add = delegate(int x, int y)
{
return x + y;
};
Action<int> print = delegate(int x)
{
Console.WriteLine(x);
}
Action<int> helloWorld = delegate // parameters can be elided if ignored
{
Console.WriteLine("Hello world!");
}
-
Expression Lambda (disponible à partir de C# 3 et suivantes)
Func<int, int, int> add = (int x, int y) => x + y; // or...
Func<int, int, int> add = (x,y) => x + y; // types are inferred by the compiler
-
Déclaration des lambdas (disponible à partir de C# 3 et suivantes)
Action<int> print = (int x) => { Console.WriteLine(x); };
Action<int> print = x => { Console.WriteLine(x); }; // inferred types
Func<int, int, int> add = (x,y) => { return x + y; };
Il existe essentiellement deux types différents pour ces: Func
et Action
. Func
s valeurs de retour, mais Action
s n'en ont pas. Le dernier paramètre de type d'un Func
est le type de retour, tous les autres sont les types de paramètres.
Il y a des types similaires avec des noms différents, mais la syntaxe pour déclarer leur inline est le même. Un exemple de ceci est Comparison<T>
, ce qui est à peu près équivalent à Func<T,T,int>
.
Func<string,string,int> compare1 = (l,r) => 1;
Comparison<string> compare2 = (l,r) => 1;
Comparison<string> compare3 = compare1; // this one only works from C# 4 onwards
Ceux-ci peuvent être directement invoquée comme si elles étaient des méthodes régulières:
int x = add(23,17); // x == 40
print(x); // outputs 40
helloWorld(x); // helloWord has one int parameter declared: Action<int>
// even though it does not make any use of it.