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

Урок 8 : Делегаты и события

О чём этот урок

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


Теория

Вопросы для самопроверки

  1. Что такое делегат в C#?
  2. В чём разница между обычным вызовом метода и вызовом через делегат?
  3. Что такое сигнатура метода и как она связана с делегатами?
  4. Что такое анонимный метод и как он связан с делегатом?
  5. Какие 3 типа делегата по умолчанию предоставляет .NET?
  6. Что такое событие (event) в C# и чем оно отличается от обычного делегата-поля?
  7. Какова стандартная сигнатура обработчика событий в .NET? Что такое EventArgs?
  8. Что делает оператор ?. при вызове события MyEvent?.Invoke(...)?


Практика

Как выполнять задания

Откройте файл Lesson8.cs для выполнения заданий. Результат выводить в строку консоли.

Задания

Задание 1.

Создайте класс Timer с событиями:

  • public event EventHandler Tick - срабатывает каждую секунду;
  • public event EventHandler Finished - срабатывает по истечении заданного времени.
    Класс должен иметь:
  • метод Start(int seconds) - запускает таймер;
  • приватный метод OnTick() - вызывает событие Tick;
  • приватный метод OnFinished() - вызывает событие Finished.
    Создайте экземпляр таймера, подпишитесь на оба события. Запустите таймер на 5 секунд.
Задание 2.

Создайте список List<int> с числами от 1 до 20.
Создайте три метода, возвращающих bool и принимающих int:

  • IsEven(int number) - true, если число чётное;
  • IsOdd(int number) - true, если число нечётное;
  • IsGreaterThanTen(int number) - true, если число > 10.
    Привяжите к этим методам предикаты (Predicate<int>).
    Создайте метод FilterNumbers, который принимает:
  • List<int> numbers
  • Predicate<int> filter
    Метод возвращает новый список с отфильтрованными числами. Отфильтруйте список тремя разными способами и выведите каждый результат.
Задание 3.

** Создайте систему логирования:
Структура LogMessage:

  • DateTime Time - время создания;
  • LogLevel Level - уровень (Info, Warning, Error);
  • string Message - текст сообщения;
  • string Source - источник сообщения. *
    Класс Logger:
  • событие public event Action<LogMessage> LogMessageReceived;
  • методы логирования: Info(), Warning(), Error();
  • защищённый метод OnLogMessageReceived() для вызова события.
Задание 4.

Создайте класс ConsoleLogger для обработки и вывода логов в консоль:

  • разный цвет текста для разных уровней;
  • формат вывода: [Время] [Уровень]: Сообщение.
    Сделайте примеры использования логгера.

📋 Вернуться к теории урока 8