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
        }
    }
}