Это плохая практика писать встроенные обработчики событий - PullRequest
57 голосов
/ 31 октября 2010

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

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

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

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

Ответы [ 3 ]

71 голосов
/ 31 октября 2010

Это абсолютно нормально - хотя есть два предостережения:

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

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

// We don't care about the arguments here; SaveDocument shouldn't need parameters
saveButton.Click += delegate { SaveDocument(); };
3 голосов
/ 01 ноября 2010

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

  • Когда я читаю класс, это более понятнопшеница продолжается«On» сообщает мне, что это обработчик события can.
  • В случае «встроенного» метода проще установить точку останова в методе.
  • Событие вызывается долгое время после «Foo ”подрядчик вернулся, и я не думаю, что он работает в области действия подрядчика.

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

0 голосов
/ 01 ноября 2010

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

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

...