Подтвердить что ты не робот

Неправильная ли практика написания встроенных обработчиков событий

Является ли плохой практикой писать встроенные обработчики событий?

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

Я предпочитаю это:

// 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();
}
4b9b3361

Ответ 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

Вы помещаете два образца вместе. Понятно, что второй вариант (который вы не предпочитаете) является наиболее читаемым.

Очень важны читаемость и ремонтопригодность кода. Держите вещи простыми, как можно более понятными. Лямбда-выражения обычно считаются более трудными для понимания большинством людей. Даже если это вторая натура для вас, для других это может быть не так.