C# Делегати

2075 / C# / Делегати

 

  • Делегат — це тип, який представляє посилання на методи з конкретним списком параметрів
  • При створенні екземпляра делегата – цей екземпляр можна пов'язати з будь-яким методом 
  • Лямбда-вирази є більш зручними
  • Анонімний метод

 

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