Объяснение позади класса EventArgs

Есть больше опций, которые можно использовать для объединения целого числа (или другого числового объекта) со строкой. Это Boost.Format

#include 
#include 
int main()
{
    using boost::format;

    int age = 22;
    std::string str_age = str(format("age is %1%") % age);
}

и Карма из Boost.Spirit (v2)

#include 
#include 
#include 
int main()
{
    using namespace boost::spirit;

    int age = 22;
    std::string str_age("age is ");
    std::back_insert_iterator sink(str_age);
    karma::generate(sink, int_, age);

    return 0;
}

Boost.Spirit Karma претендует на быть одним из самых быстрых вариантов для преобразования целых в строку .

10
задан DavidRR 13 August 2015 в 13:32
поделиться

6 ответов

Плюсы класса EventArgs (на мой взгляд) в основном следующие:

  • Вы можете добавлять членов в класс EventArgs, не изменяя сигнатуру события.
  • Вы отключаетесь информация, переданная обработчику события из экземпляра объекта

Возможно даже, что информация, содержащаяся в EventArgs, не раскрывается объектом, вызывающим событие.

Конечно, в некоторых случаях это может показаться излишним, но Я считаю, что сила тождества - это хорошо; если вы знаете, как работает одно событие, вы знаете, как работают и другие события.

11
ответ дан 3 December 2019 в 14:53
поделиться

Класс EventArgs необходим, потому что, если вы захотите расширить свое событие, чтобы предоставить больше информации в будущем, у вас возникнут проблемы с переносимостью для всех клиентов, использующих исходную сигнатуру метода. исходного события.

Например,

public void IHandleEventVersion1(string p1, int p2)
{
    ....
}

Теперь вы хотите предоставить дополнительную информацию в событии EventVersion1 выше (вы хотите включить char ). Затем вам придется заставить клиента переписать свою обработку событий в соответствии с вашими новыми требованиями, например:

public void IHandleEventVersion1(string p1, int p2, char p2)
{
    ...
}

Видите, насколько неудобным может быть попытка предоставить дополнительную информацию?

Итак, EventArgs class предоставляет общий шаблон проектирования для программирования, позволяя вам и мне быстро расширять данные, которые мы хотим предоставить для события.

Общий шаблон кодирования среды обработки событий таков: { публичное событие EventHandler / * (точка 2) * / MyEvent; / * (точка 1) * / // (точка 3 + 4) защищенная виртуальная пустота OnMyEvent () { EventHandler temp = MyEvent; если (темп! = ноль) temp (это, EventArgs.Empty); } public void SomeMethodThatWillRaiseTheEvent () { .... OnMyEvent (); } }

9
ответ дан 3 December 2019 в 14:53
поделиться

EventArgs полезен для:

  • показа вам состояния в момент времени , в который произошло событие
  • повышения производительности кода обработки событий путем предоставление информации о событии без необходимости запрашивать «стороннюю организацию»
  • , содержащую данные, которые не предоставляются объектом, вызывающим событие

. Чтобы развернуть первую точку .... между вашим событием вызывается обработчик и вы читаете состояние объекта, который вызвал событие, могли произойти другие вещи, которые полностью изменили состояние на что-то другое. В этом случае вы бы отреагировали, например, на событие «AlarmHasGoneOff» на AlarmClock, когда будильник уже отключен.

Также можно реагировать на возникшие события »

6
ответ дан 3 December 2019 в 14:53
поделиться

Данные, передаваемые в EventArgs, не обязательно доступны в свойствах объекта, создавшего событие. Например, в событии MouseDown MouseEventArgs включает информацию о текущем положении мыши. Объект, который сгенерировал это событие, вероятно, даже не хранит ничего столь изменчивого.

2
ответ дан 3 December 2019 в 14:53
поделиться

Вам не нужно передавать EventArgs.Empty обработчику. Вы можете передать любой производный класс. Когда обработчик событий определен для приема EventArgs в качестве параметра, это означает, что нет никаких конкретных аргументов, которые всегда доступны, но вы можете передать свои собственные для дополнительной информации.

2
ответ дан 3 December 2019 в 14:53
поделиться

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

public SomeWinFormClass() { 
  InitializeComponent();
  _yourClassInstance = new YourClass();
  someButton.Click += SomethingICareAboutHappened;
  _yourClassInstance.YourEvent += SomethingICareAboutHappened;
}

private void SomethingICareAboutHappened(object sender, EventArgs e)
{
  // do something -- logging, signaling a handle someone's 
  // waiting for, etc.
}

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

1
ответ дан 3 December 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: