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

Неправильно ли писать записи inline-обработчиков?

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

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

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

Это абсолютно нормально – хотя есть два оговорки:

  • Если вы изменяете локальную переменную из закрытия, вы должны убедиться, что понимаете, что делаете.
  • Вы не сможете отказаться от подписки на мероприятие

Обычно я использую только простые обработчики событий – для чего-то большего, я использую lambda-выражения (или анонимные методы) для подписки с вызовом метода с более подходящим методом:

 // We don't care about the arguments here; SaveDocument shouldn't need parameters saveButton.Click += delegate { SaveDocument(); }; 

В большинстве случаев я бы предпочел иметь отдельные методы типа «timer_Tick ()», однако я бы предпочел, чтобы он назывался OnTimerTick () следующим образом:

  • Когда я читаю этот class, яснее становится пшеница. «Вкл» говорит мне, может ли он обработчик события.
  • Легче установить точку прерывания в методе в «встроенном» случае.
  • Мероприятие уволено долгое время после того, как подрядчик «Фу» вернулся, и я не думаю, что он работает в рамках подрядчика.

Однако, если событие будет запущено только до того, как метод будет объявлен в виде строки, а объект, на который установлено событие, имеет область видимости, ограниченную методом объявления, тогда я думаю, что версия «в строке» лучше. Поэтому мне нравится использовать «in line» для передачи делегату сравнения методу «сортировки».

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

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