Если вы новичок в программировании на C#, возможно, вы не знакомы с делегатами и событиями. Однако эти две функции являются мощными инструментами, которые могут значительно улучшить модульность и масштабируемость вашего кода. Разрешение асинхронной и слабосвязанной связи между объектами, делегатами и событиями позволяет создавать более гибкое и удобное в сопровождении программное обеспечение.

Во-первых, давайте поговорим о делегатах. В C# делегат — это тип, представляющий метод с определенной сигнатурой. Другими словами, делегат — это указатель на метод. Вы можете использовать делегат для передачи метода в качестве аргумента другому методу, который затем может вызывать переданный метод.

Вот пример:

delegate int MyDelegate(int x, int y);

public static class MyClass
{
    public static int Add(int x, int y) { return x + y; }
    public static int Multiply(int x, int y) { return x * y; }
}

public class Program
{
    static void Main(string[] args)
    {
        MyDelegate myDelegate = new MyDelegate(MyClass.Add);
        int result = myDelegate(3, 4); // result is 7
        Console.WriteLine(result);
    }
}

В этом примере мы определяем делегат с именем MyDelegate, который принимает два целых числа и возвращает целое число. Затем мы определяем в MyClass два метода с именами Add и Multiply, которые соответствуют сигнатуре MyDelegate. В методе Main мы создаем экземпляр MyDelegate и указываем его методу Add. Затем мы вызываем делегата и передаем аргументы 3 и 4, в результате чего на консоль выводится 7.

Теперь поговорим о событиях. События — это способ, с помощью которого объекты уведомляют других о том, что что-то произошло. В C# события основаны на делегатах, поэтому создание и обработка события аналогичны вызову делегата.

Вот пример:

public class MyEventArgs : EventArgs
{
    public int Value { get; set; }
    public MyEventArgs(int value) { Value = value; }
}

public class MyPublisher
{
    public event EventHandler<MyEventArgs> MyEvent;
    public void RaiseEvent(int value)
    {
        MyEvent?.Invoke(this, new MyEventArgs(value));
    }
}

public class MySubscriber
{
    public void HandleEvent(object sender, MyEventArgs e)
    {
        Console.WriteLine("Event raised with value: " + e.Value);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyPublisher publisher = new MyPublisher();
        MySubscriber subscriber = new MySubscriber();
        publisher.MyEvent += subscriber.HandleEvent;
        publisher.RaiseEvent(5); // "Event raised with value: 5" is printed to the console
    }
}

В этом примере мы определяем класс аргументов пользовательского события с именем MyEventArgs, который имеет одно свойство с именем Value. Затем мы определяем класс с именем MyPublisher, у которого есть событие с именем MyEvent. Событие имеет тип EventHandler<MyEventArgs>, что означает, что оно принимает два аргумента: объект и экземпляр MyEventArgs. Мы также определяем метод с именем RaiseEvent in MyPublisher, который вызывает событие и передает значение.

И мы определяем класс с именем MySubscriber, который имеет метод с именем HandleEvent, который принимает объект-отправитель и экземпляр MyEventArgs в качестве аргументов. Этот метод выводит значение свойства Value на консоль.

В методе Main мы создаем экземпляр MyPublisher и MySubscriber. Затем мы используем оператор +=, чтобы подписать метод HandleEvent MySubscriber на событие MyEvent MyPublisher. Это означает, что когда MyPublisher вызывает событие, будет вызван метод HandleEvent MySubscriber.

Наконец, мы вызываем метод RaiseEvent для MyPublisher и передаем значение 5. Это приводит к возникновению события MyEvent и вызову метода HandleEvent для MySubscriber, в консоль будет выведено сообщение «Событие возбуждено со значением: 5».

Еще одна вещь, если вы не знакомы с оператором ?., он называется оператором с нулевым условием. Он будет выполнять только правую часть оператора, если левая часть не null. Это отличный способ избежать ужасного исключения «Ссылка на объект не указывает на экземпляр объекта».

Если вы нашли эту статью полезной, похлопайте ей в ладоши.

Приготовьтесь смеяться, учиться и, возможно, даже плакать (от разочарования), пока мы погружаемся в дикий мир объектно-ориентированного программирования на C#. Пристегнитесь, ребята, потому что эта серия будет дикой поездкой для понимания фундаментальных концепций. Так что сядьте поудобнее, расслабьтесь и позвольте хорошим временам идти своим чередом (и кодом).

Классы и объекты, Наследование, Абстракция, Инкапсуляция, Полиморфизм, Интерфейсы, Модификаторы и свойства доступа, Обработка исключений, Универсальные шаблоны, Конструкторы, Делегаты и события.

Отказ от ответственности: часть этой статьи была написана с помощью инструмента искусственного интеллекта.
Но автор просмотрел и отредактировал содержимое.