Делегаты в C# – это типы данных, которые представляют собой ссылку на методы. Они используются в .NET для реализации механизма обратного вызова, что позволяет передавать методы как параметры другим методам или хранить их в коллекциях.
Одним из основных применений делегатов является событийная модель программирования. События позволяют классам обмениваться информацией о происходящих событиях и реагировать на них. В классе, генерирующем событие, определяется делегат, который представляет собой тип метода, который будет вызван при наступлении события. Затем другие классы, заинтересованные в событии, подписываются на него, добавляя свои методы обработчики в список вызовов делегата. При наступлении события делегат вызывает все добавленные методы обработчики, передавая им необходимые данные.
В C# объявление делегата состоит из ключевого слова "delegate", имени делегата, списка параметров и возвращаемого типа. Например:
delegate void MyDelegate(int x, int y);
Для создания экземпляра делегата необходимо сначала создать метод, соответствующий сигнатуре делегата. Затем, используя конструктор делегата, создается ссылка на этот метод. К примеру:
class MyClass { public static void MyMethod(int a, int b) { Console.WriteLine(a + b); } } MyDelegate myDelegate = new MyDelegate(MyClass.MyMethod);
Когда делегат создан, его можно вызвать, используя синтаксис обычного вызова метода:
myDelegate(5, 10);
Кроме того, C# предоставляет механизм делегатов, называемый анонимными методами. Анонимные методы позволяют определять и использовать методы без объявления отдельного метода в классе. Они наиболее удобны, когда требуется передать метод как параметр в другой метод. Например:
MyDelegate myDelegate = delegate(int a, int b) { Console.WriteLine(a + b); };
Анонимные методы могут использовать переменные, определенные внутри внешнего метода. Это называется "захватом контекста". Например:
int c = 20; MyDelegate myDelegate = delegate(int a, int b) { Console.WriteLine(a + b + c); };
Делегаты также могут объединяться и удаляться с помощью операций "+=" и "-=". Это позволяет создавать цепочки вызовов, когда несколько методов могут быть вызваны в определенном порядке при вызове делегата. Например:
MyDelegate myDelegate1 = MyClass.MyMethod1; MyDelegate myDelegate2 = MyClass.MyMethod2; MyDelegate combinedDelegate = myDelegate1 + myDelegate2; combinedDelegate(5, 10);
Обратите внимание, что делегаты являются неизменяемыми, и каждый раз при добавлении или удалении метода формируется новый делегат (ссылка).