Неправильная ли практика написания встроенных обработчиков событий
Является ли плохой практикой писать встроенные обработчики событий?
Для меня я предпочитаю использовать его, когда я хочу использовать локальную переменную в обработчике событий, как показано ниже:
Я предпочитаю это:
// This is just a sample
private void Foo()
{
Timer timer = new Timer() { Interval = 1000 };
int counter = 0; // counter has just this mission
timer.Tick += (s, e) => myTextBox.Text = (counter++).ToString();
timer.Start();
}
Вместо этого:
int counter = 0; // No need for this out of Boo & the event handler
private void Boo()
{
Timer timer = new Timer() { Interval = 1000 };
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
myTextBox.Text = (counter++).ToString();
}
Ответы
Ответ 1
Это абсолютно нормально - хотя есть два оговорки:
- Если вы изменяете локальную переменную из замыкания, вы должны убедиться, что вы понимаете, что вы делаете.
- Вы не сможете отказаться от подписки на мероприятие
Обычно я только встроенный в действительно простые обработчики событий - для чего-то большего, я использую лямбда-выражения (или анонимные методы), чтобы подписаться с вызовом метода с более подходящим методом:
// We don't care about the arguments here; SaveDocument shouldn't need parameters
saveButton.Click += delegate { SaveDocument(); };
Ответ 2
В большинстве случаев я бы предпочел иметь отдельные методы типа "timer_Tick()", однако я бы предпочел, чтобы он назывался OnTimerTick() как:
- Когда я читаю класс, происходит более чистая пшеница. "On" сообщает мне свой обработчик событий.
- Легче установить точку прерывания в методе в "inline" случае.
- Событие запускается долгое время после того, как подрядчик "Foo" вернулся, и я не думаю, что он работает в рамках подрядчика.
Однако, если событие будет запущено только до того, как метод будет объявлен в виде строки, и объект, на который установлено событие, имеет область видимости, ограниченную методом объявления, тогда я думаю, что версия "в строке" лучше. Поэтому мне нравится использовать "in line" для передачи делегату сравнения методу "сортировки".
Ответ 3
Вы помещаете два образца вместе. Понятно, что второй вариант (который вы не предпочитаете) является наиболее читаемым.
Очень важны читаемость и ремонтопригодность кода. Держите вещи простыми, как можно более понятными. Лямбда-выражения обычно считаются более трудными для понимания большинством людей. Даже если это вторая натура для вас, для других это может быть не так.