Делегаты (delegate) в C#

Делегаты (delegate) — это типы, которые представляют собой указатели на методы. Они позволяют передавать методы в качестве параметров, вызывать их динамически и использовать для обработки событий.

Объявление и использование делегатов

Делегат объявляется с указанием возвращаемого типа и списка параметров, аналогично сигнатуре метода.

delegate void MyDelegate(string message);

class Program
{
    static void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }

    static void Main()
    {
        MyDelegate del = PrintMessage;
        del("Hello, world!");
    }
}

Групповые делегаты (Multicast Delegates)

Делегаты могут хранить ссылки на несколько методов, объединяя их в список вызова.

delegate void MyDelegate(string message);

class Program
{
    static void PrintMessage(string message) => Console.WriteLine($"Message: {message}");
    static void PrintUpperMessage(string message) => Console.WriteLine($"Uppercase: {message.ToUpper()}");

    static void Main()
    {
        MyDelegate del = PrintMessage;
        del += PrintUpperMessage;
        del("Hello");
    }
}

Делегаты и анонимные методы

Анонимные методы позволяют создавать методы без явного объявления.

delegate void MyDelegate(string message);

class Program
{
    static void Main()
    {
        MyDelegate del = delegate (string msg) 
        {
            Console.WriteLine($"Anonymous: {msg}");
        };
        del("Hello");
    }
}

Лямбда-выражения

Лямбда-выражения упрощают объявление анонимных методов.

delegate int MathOperation(int a, int b);

class Program
{
    static void Main()
    {
        MathOperation add = (a, b) => a + b;
        Console.WriteLine(add(5, 3));
    }
}

Делегаты и события

Делегаты часто используются для обработки событий.

using System;

class EventExample
{
    public delegate void Notify();
    public event Notify OnNotify;

    public void TriggerEvent()
    {
        OnNotify?.Invoke();
    }
}

class Program
{
    static void Main()
    {
        EventExample obj = new EventExample();
        obj.OnNotify += () => Console.WriteLine("Event triggered!");
        obj.TriggerEvent();
    }
}

Делегаты обеспечивают гибкость работы с методами, позволяя создавать более модульный и расширяемый код.