Metody anoniomowe
W jednym z poprzednich artykułów dowiedzieliśmy się o tym, że delegaty są używane aby odnieść się do dowolnej metody o takiej samej sygnaturze
jak delgat. Innymi słowy, możesz wywołać metodę, która jest referencją delegata, używając do tego obiektu delegata.
Metody anonimowe dostarczają technikę, która pozwala na przekazanie bloku kodu jako parametr delegata. Metody anoniomowe to są metody bez nazwy,
jedynie z blokiem kodu do wykonania.
Nie trzeba określać typu zwracanego w metodzie anonimowej, wynika to z instrukcji return wewnątrz bloku kodu.
Pisanie metod anonimowych
Metody anoniomowe deklarujemy z wykorzystaniem instancji delegata, ze słowem kluczowym delegate. Przykład:
delegate void ChangeNumber(int n);
…
ChangeNumber nc = delegate (int i)
{
Console.WriteLine("Wnętrze metody anonimowej: {0}", i);
};
Blok kodu, używający metody do wyświetlania tekstu, jest blokiem kodu metody anonimowej.
Delegat może zostać użyty do wywołania zarówno metody anoniomowej jak i metody nazwanej w ten sam sposób, np. przez przekazanie parametrów metody
do obiektu delegata.
Poniżej przykład z wykorzystaniem metod anonimowych:
using System;
namespace AnonymousMethod
{
delegate void ChangeNumber(int n);
class Program
{
static int number = 10;
public static void AddNumber(int a)
{
number += a;
Console.WriteLine("Metoda nazwana: {0}", number);
}
public static void MultiplyNumber(int m)
{
number *= m;
Console.WriteLine("Metoda nazwana: {0}", number);
}
public static int GetNumber()
{
return number;
}
static void Main(string[] args)
{
// Tworzymy instancję delegata używając metody anonimowej
ChangeNumber cn = delegate (int x)
{
Console.WriteLine("Metoda anonimowa: {0}", x);
};
// wywołanie delegata używając metody anonimowej
cn(10);
// a teraz inicjowanie delgata używając metody nazwanej
cn = new ChangeNumber(AddNumber);
// wywołanie delegata używając metody nazwanej
cn(10);
// inicjowanie delegata przy użyciu innej metody nazwanej
cn = new ChangeNumber(MultiplyNumber);
// wywołanie delegata
cn(2);
// Zwrócenie liczby po dokonanych zmianach
Console.WriteLine("Rezultat: {0}", Program.GetNumber());
Console.ReadKey();
// Wynik działania programu
// Metoda anonimowa: 10
// Metoda nazwana: 20
// Metoda nazwana: 40
// Rezultat: 40
}
}
}