MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Delegațiile Action, Predicate și Func

În .NET există câțiva delegați încorporați care sunt utilizați în diverse situații. Cei mai utilizați, cu care se întâlnesc adesea, sunt Action, Predicate și Func.

Action

Delegatul Action reprezintă o anumită acțiune care nu returnează nimic, adică are ca tip de returnare void:

public delegate void Action()
public delegate void Action<in T>(T obj)

Acest delegat are mai multe versiuni supraîncărcate. Fiecare versiune acceptă un număr diferit de parametri: de la Action<in T1> până la Action<in T1, in T2,...in T16>. Astfel, se pot transmite până la 16 valori către metodă.

De obicei, acest delegat este transmis ca parametru al metodei și prevede apelarea unor acțiuni specifice în răspuns la anumite acțiuni care au avut loc. De exemplu:

DoOperation(10, 6, Add);        // 10 + 6 = 16
DoOperation(10, 6, Multiply);   // 10 * 6 = 60

void DoOperation(int a, int b, Action<int, int> op) => op(a, b);

void Add(int x, int y) => Console.WriteLine($"{x} + {y} = {x + y}");
void Multiply(int x, int y) => Console.WriteLine($"{x} * {y} = {x * y}");

Predicate

Delegatul Predicate<T> acceptă un singur parametru și returnează o valoare de tip bool:

delegate bool Predicate<in T>(T obj);

De obicei, este utilizat pentru compararea sau potrivirea unui anumit obiect T cu o anumită condiție. Ca rezultat, returnează valoarea true dacă condiția este îndeplinită și false dacă nu este îndeplinită:


Predicate<int> isPositive = (int x) => x > 0;

Console.WriteLine(isPositive(20));
Console.WriteLine(isPositive(-20));

În acest caz, returnează true sau false în funcție de faptul dacă numărul este mai mare sau mai mic decât zero.

Func

Un alt delegat comun este Func. Acesta returnează rezultatul unei acțiuni și poate accepta parametri. Are, de asemenea, diverse forme: de la Func<out T>(), unde T este tipul valorii returnate, până la Func<in T1, in T2,...in T16, out TResult>(), adică poate accepta până la 16 parametri.

TResult Func<out TResult>()
TResult Func<in T, out TResult>(T arg)
TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)
TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3)
TResult Func<in T1, in T2, in T3, in T4, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
//...........................................

Acest delegat este, de asemenea, utilizat frecvent ca parametru în metode:

int result1 = DoOperation(6, DoubleNumber); // 12
Console.WriteLine(result1);

int result2 = DoOperation(6, SquareNumber); // 36
Console.WriteLine(result2);

int DoOperation(int n, Func<int, int> operation) => operation(n);
int DoubleNumber(int n) => 2 * n;
int SquareNumber(int n) => n * n;

Metoda DoOperation() acceptă ca parametru un delegat Func<int, int>, adică o referință la o metodă care acceptă un număr de tip int și returnează tot un număr de tip int.

La primul apel al metodei DoOperation(), i se transmite o referință la metoda DoubleNumber, care dublează numărul. În al doilea caz, i se transmite metoda SquareNumber - o metodă care acceptă un parametru de tip int și returnează rezultatul ca valoare de tip int.

Un alt exemplu:

Func<int, int, string> createString = (a, b) => $"{a}{b}";
Console.WriteLine(createString(1, 5));  // 15
Console.WriteLine(createString(3, 5));  // 35

Aici, variabila createString reprezintă o expresie lambda care acceptă două numere de tip int și returnează un șir, adică reprezintă un delegat Func<int, int, string>.

← Lecția anterioară Lecția următoare →