Делегати

1. Об'єкт, що вказує на метод і дає можливість визвати цей метод

2. Анонімний метод

3. Лямбда-вирази є більш зручними

Thread thread = new Thread(

     delegate(){ F1(a); }    // () =>  { F1(a); } 

);

Приклад 1

    delegate int IntOperation(int i, int j);

    public class MyClass

    {

        public static int Sum(int x, int y)

        {

            return x + y;

        }

        public static int Prz(int x, int y)

        {

            return x * y;

        }

        public static int Del(int x, int y)

        {

            return x / y;

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            // Ініціалізуємо делегат

            IntOperation op1 = MyClass.Sum;

            int result = op1(5, 10);

            Console.WriteLine("Сума: " + result);

            op1 = MyClass.Prz;

            result = op1(5, 10);

            Console.WriteLine("Добуток: " + result);

            Console.ReadLine();

        }

    }

Приклад 2

public delegate void Print(int value);

static void Main(string[] args)

{

     Print printDel = PrintNumber;     // Print printDel = new Print(PrintNumber);

     printDel(200);

     printDel = PrintMoney;

     printDel(200);

     Console.ReadKey();

}

public static void PrintNumber(int num)

{

     Console.WriteLine("Number: {0}", num);

}

public static void PrintMoney(int money)

{

     Console.WriteLine("Money: {0} $", money);

}

Number: 200

Money: 200 $

Приклад 3

delegate void HELLO();

static void Main(string[] args)

{     

     HELLO HW = delegate { Console.WriteLine("Hello Ukraine!"); };

     HW();

     HW.Invoke();

     Console.ReadKey();

}

Можна визвати зразу кілька методів

delegate void MyDelegate();

static void Main(string[] args)

{     

     var cars = F1;                // new MyDelegate(F1)

     cars += F2;

     cars += F3;

     cars.Invoke();                // або cars();

}

Запуск додаткової функції при події

button1.Click += new EventHandler(this.My_Click);              // WinForm

button1.Click += new RoutedEventHandler(this.My_Click);    //WPF