Прочитать на английском

Поделиться через


EventHandler<TEventArgs> Делегат

Определение

Представляет метод, обрабатывающий событие, когда событие предоставляет данные.

C#
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
C#
public delegate void EventHandler<TEventArgs>(object? sender, TEventArgs e);
C#
[System.Serializable]
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs : EventArgs;
C#
[System.Serializable]
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

Параметры типа

TEventArgs

Тип данных события, создаваемых событием.

Параметры

sender
Object

Источник события.

e
TEventArgs

Объект, содержащий данные о событии.

Атрибуты

Примеры

В следующем примере показано событие с именем ThresholdReached. Событие связано с делегатом EventHandler<TEventArgs> .

C#
using System;

namespace ConsoleApplication3
{
    public class Program3
    {
        public static void Main()
        {
            Counter c = new(new Random().Next(10));
            c.ThresholdReached += c_ThresholdReached;

            Console.WriteLine("press 'a' key to increase total");
            while (Console.ReadKey(true).KeyChar == 'a')
            {
                Console.WriteLine("adding one");
                c.Add(1);
            }
        }

        static void c_ThresholdReached(object? sender, ThresholdReachedEventArgs e)
        {
            Console.WriteLine("The threshold of {0} was reached at {1}.", e.Threshold,  e.TimeReached);
            Environment.Exit(0);
        }
    }

    class Counter
    {
        private readonly int _threshold;
        private int _total;

        public Counter(int passedThreshold)
        {
            _threshold = passedThreshold;
        }

        public void Add(int x)
        {
            _total += x;
            if (_total >= _threshold)
            {
                ThresholdReachedEventArgs args = new()
                {
                    Threshold = _threshold,
                    TimeReached = DateTime.Now
                };
                OnThresholdReached(args);
            }
        }

        protected virtual void OnThresholdReached(ThresholdReachedEventArgs e)
        {
            ThresholdReached?.Invoke(this, e);
        }

        public event EventHandler<ThresholdReachedEventArgs>? ThresholdReached;
    }

    public class ThresholdReachedEventArgs : EventArgs
    {
        public int Threshold { get; set; }
        public DateTime TimeReached { get; set; }
    }
}

Комментарии

Модель событий в платформа .NET Framework основана на наличии делегата события, который соединяет событие с его обработчиком. Чтобы вызвать событие, требуются два элемента:

  • Делегат, ссылающийся на метод, предоставляющий ответ на событие.

  • При необходимости класс, содержащий данные события, если событие предоставляет данные.

Делегат — это тип, определяющий сигнатуру, то есть тип возвращаемого значения и типы списка параметров для метода. Тип делегата можно использовать для объявления переменной, которая может ссылаться на любой метод с той же сигнатурой, что и делегат.

Стандартная сигнатура делегата обработчика событий определяет метод, который не возвращает значение. Первый параметр этого метода имеет тип Object и ссылается на экземпляр, который вызывает событие . Второй параметр является производным от типа EventArgs и содержит данные события. Если событие не создает данные события, вторым параметром является просто значение EventArgs.Empty поля. В противном случае второй параметр является типом, производным от EventArgs , и предоставляет все поля или свойства, необходимые для хранения данных события.

Делегат EventHandler<TEventArgs> — это предопределенный делегат, представляющий метод обработчика событий для события, создающего данные. Преимущество использования EventHandler<TEventArgs> заключается в том, что вам не нужно кодировать собственный пользовательский делегат, если событие создает данные события. Просто укажите тип объекта данных события в качестве универсального параметра.

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

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

Методы расширения

GetMethodInfo(Delegate)

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

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

См. также раздел