Есть больше опций, которые можно использовать для объединения целого числа (или другого числового объекта) со строкой. Это 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 претендует на быть одним из самых быстрых вариантов для преобразования целых в строку .
Плюсы класса EventArgs (на мой взгляд) в основном следующие:
Возможно даже, что информация, содержащаяся в EventArgs, не раскрывается объектом, вызывающим событие.
Конечно, в некоторых случаях это может показаться излишним, но Я считаю, что сила тождества - это хорошо; если вы знаете, как работает одно событие, вы знаете, как работают и другие события.
Класс 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 (); } }
EventArgs полезен для:
. Чтобы развернуть первую точку .... между вашим событием вызывается обработчик и вы читаете состояние объекта, который вызвал событие, могли произойти другие вещи, которые полностью изменили состояние на что-то другое. В этом случае вы бы отреагировали, например, на событие «AlarmHasGoneOff» на AlarmClock, когда будильник уже отключен.
Также можно реагировать на возникшие события »
Данные, передаваемые в EventArgs, не обязательно доступны в свойствах объекта, создавшего событие. Например, в событии MouseDown MouseEventArgs включает информацию о текущем положении мыши. Объект, который сгенерировал это событие, вероятно, даже не хранит ничего столь изменчивого.
Вам не нужно передавать EventArgs.Empty
обработчику. Вы можете передать любой производный класс. Когда обработчик событий определен для приема EventArgs
в качестве параметра, это означает, что нет никаких конкретных аргументов, которые всегда доступны, но вы можете передать свои собственные для дополнительной информации.
Еще одна приятная вещь, которую вы получаете, следуя стандартному шаблону, заключается в том, что люди, использующие ваш класс, который предоставляет событие, могут подключать общие обработчики событий:
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, я не думаю, что вам это сойдет с рук, хотя, похоже, у вас должно получиться.