Если вы новичок в программировании на 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#. Пристегнитесь, ребята, потому что эта серия будет дикой поездкой для понимания фундаментальных концепций. Так что сядьте поудобнее, расслабьтесь и позвольте хорошим временам идти своим чередом (и кодом).
Классы и объекты, Наследование, Абстракция, Инкапсуляция, Полиморфизм, Интерфейсы, Модификаторы и свойства доступа, Обработка исключений, Универсальные шаблоны, Конструкторы, Делегаты и события.
Отказ от ответственности: часть этой статьи была написана с помощью инструмента искусственного интеллекта.
Но автор просмотрел и отредактировал содержимое.