Сделать обработчик события для элемента управления или поместить его в конструктор формы? Какой из них лучше? - PullRequest
0 голосов
/ 23 ноября 2011

Какое из этих решений выглядит лучше и понятнее?

В конструкторе формы:

textBox1.KeyDown += delegate(object o, KeyEventArgs e)
{
    if (e.KeyCode== Keys.Enter)
    {
        button1.PerformClick();
    }
};

Или:

private void textBox1_KeyDown(object sender, KeyEventArgs e)

    {
        if (e.KeyCode == Keys.Return) 
        {
            button1.PerformClick();
        }
    }

Ответы [ 5 ]

2 голосов
/ 23 ноября 2011

Выбор реализации зависит от ваших требований, которые мы точно не знаем и которые могут со временем измениться.

Пока ваш обработчик не должен быть добавлен или удален динамически или содержать какие-либо данные, которые известны только во время выполнения, я не вижу смысла заключать его в делегат и добавлять в вашу форму. И вам нужно будет реализовать собственный метод деструктора / Dispose(), чтобы явно удалить этот обработчик для предотвращения утечек памяти.

Итак, второе решение со статическим обработчиком кажется мне здесь оптимальным. Затем вы можете легко увидеть, какие обработчики событий ваш элемент управления textBox1 фактически реализует непосредственно в свойствах элемента управления в Visual Studio, и вам не нужно искать эту реализацию обработчика в своем коде, если вам потребуется изменить ее позже.

1 голос
/ 23 ноября 2011

Первый выглядит нормально, когда у вас есть только один обработчик событий.Однако, что если у вас есть 10 или 20?Это привело бы к довольно раздутому конструктору.Определенно лучше иметь обработчик событий, но даже тогда лучше не иметь много бизнес-логики в обработчике событий.

Кроме того, использование делегатов в конструкторе не позволит редактировать и продолжить работу.

0 голосов
/ 23 ноября 2011

Это вопрос стиля, но лично я избегаю создания анонимных делегатов с более чем одной строкой кода.Например, это работает от меня

btnSave.Click += (sender, e) => Save();

@ Марко, Александр: Как можно утечь память с этими обработчиками событий?Я думаю, что это происходит только в том случае, если источник событий является статическим.

0 голосов
/ 23 ноября 2011

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

Но два решения зависят от вашей цели.

0 голосов
/ 23 ноября 2011

Это зависит: если бы вы могли сделать это во время разработки, я бы предпочел второе.
Если вы используете первое, не забудьте использовать textBox1.KeyDown -= перед закрытием формы, чтобы избежать утечек памяти.

...