Definition
Un délégué est un pointeur sur méthode.
delegate
|
delegate int MonDélégué(string inString);
int CountLetters(string inString)
{
return inString.Length;
}
MonDélégué monDéléguéA = new MonDélégué(CountLetters);
MonDélégué monDéléguéA = CountLetters;
MonDélégué monDéléguéA = delegate(string inString) { return inString.Length; };
MonDélégué monDéléguéA = (string inString) => { return inString.Length; };
MonDélégué monDéléguéA = inString => inString.Length;
monDéléguéA("1");
|
Func
Signature de délégué générique ayant de 0 à 16 arguments d'entrée et 1 argument de sortie.
Cette signature de délégué générique existe grâce à la covariance (out) et la contra variance (in) des génériques introduit avec C# 4.
|
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9,
in T10, in T11, in T12, in T13, in T14, in T15, in T16, out TResult>
(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9,
T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
|
|
Func<string, int> monDéléguéA = CountLetters;
monDéléguéA("1");
Func<string, int> monDéléguéB = delegate(string inString)
{
return inString.Length;
};
monDéléguéB("12");
Func<string, int> monDéléguéC = inString => inString.Length;
monDéléguéC("123");
|
Action
Signature de délégué générique ayant de 1 à 16 arguments d'entrée et 0 argument de sortie.
|
public delegate void Action<in T>(T obj);
Action<string> a = inString => Console.WriteLine(inString);
a("Ok");
|
Predicate
Signature de délégué générique ayant de 1 argument d'entrée et 1 argument de sortie.
|
public delegate bool Predicate<in T>(T obj);
|
An expression is a sequence of operands and operators that can be evaluated to a single value.
Expression trees represent code as a tree-like data structure, where each node is an expression.
|
Expression<Func<int, int>> multiplyByFiveExpression = num => num * 5;
Func<int, int> multiplyByFiveFunction = multiplyByFiveExpression.Compile();
multiplyByFiveFunction(10);
Console.WriteLine(multiplyByFiveExpression);
Console.WriteLine(multiplyByFiveExpression.Body);
Console.WriteLine(multiplyByFiveExpression.Parameters.Count);
Console.WriteLine(multiplyByFiveExpression.Parameters[0]);
|
Multicasting et gestion des exceptions
Si une des méthodes associées à l'event lance une exception, les méethodes associées suivantes ne seront pas exécutées.
|
delegate void MyDelegate();
MyDelegate a = () => Console.WriteLine("1");
a += () =>
{
Console.WriteLine("2");
throw new Exception("xxx");
};
a += () => Console.WriteLine("3");
var exceptions = new List<Exception>();
foreach (Delegate handler in a.GetInvocationList())
{
try
{
handler.DynamicInvoke();
}
catch (Exception ex)
{
exceptions.Add(ex);
}
}
if (exceptions.Any())
{
throw new AggregateException(exceptions);
}
|