Когда переопределять, а когда подписываться на делегат?

1

Я заметил, что в С# я могу обрабатывать события несколькими способами, но я не уверен, что лучше всего использовать, посмотрите здесь:

this.Paint += Form1_Paint;

void Form1_Paint(object sender, PaintEventArgs e)
{
        Graphics g = e.Graphics;
        g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}

или

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
    g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}

Конечно, эти оба заготовки имеют одинаковый результат, а OnPaint() будет обычно (если бы я его не изменил), просто вызовите метод Form1_Paint через делегат.

Но какой из них лучше всего использовать?

спасибо

Теги:
delegates
events

3 ответа

4
Лучший ответ

Предпочтительным способом является переопределение метода OnPaint, а не регистрация на событие Paint. Таким образом, вы не связываете delegate с вашим Paint управления Paint.

Из MSDN:

Поднятие события вызывает обработчик события через делегата. Дополнительные сведения см. В разделе Обработка и повышение событий. Метод OnPaint также позволяет производным классам обрабатывать событие без присоединения делегата. Это предпочтительный метод обработки события в производном классе.

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

1

Простой, переопределенный метод OnPaint для меня (я имею в виду сам контроль или форма). Например: Если вы хотите изменить, как выглядит ваш элемент управления, вы сделаете это в переопределенном методе OnPaint.

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

Другими словами: OnPaint следует использовать, когда вы решаете внешний вид самого типа, где в качестве события Paint следует использовать, когда вы решаете внешний вид экземпляра.

1

Эти два подхода не совпадают.

Очень возможно написать код, где вызывается метод OnPaint, но не использовать метод Paint.

Фактически, код, который вы написали в своем вопросе, - именно такая ситуация.

В вашем коде отсутствует base.OnPaint(e); звоните, что на самом деле будет срабатывать событие:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    Graphics g = e.Graphics;
    g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}

Поэтому вы действительно должны решить, может ли ваше поведение повлиять на выбор одного из них.

Тем не менее, 99,999% всего кода, который правильно написан там, не является различием.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню