何时重写以及何时订阅委托

本文关键字:何时订 重写 何时 | 更新日期: 2023-09-27 18:04:48

我注意到在c#中我可以用几种不同的方式处理事件,但我不确定哪一种是最好的,看这里:

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方法。

但是哪一个是最好的使用呢?

谢谢

何时重写以及何时订阅委托

首选的方法是覆盖OnPaint方法,而不是注册到Paint事件。这样,您就不会将delegate耦合到Paint控件。

从MSDN:

引发事件通过委托调用事件处理程序。有关更多信息,请参见处理和引发事件。OnPaint方法还允许派生类在不附加委托的情况下处理事件。这是处理派生类中的事件的首选技术。

给继承者的说明:当在派生类中重写OnPaint时,一定要调用基类的OnPaint方法,以便注册的委托接收到事件。

这两种方法不是

很有可能在代码中调用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%的代码是正确编写的,那么就没有区别了。

简单,OnPaint覆盖的方法是为自己(我的意思是控件或表单本身)。例如:如果您想更改控件的外观,您可以在OnPaint overridden方法中进行。

Paint事件是为别人,我的意思是,一旦你决定看你的控制,但它不适合在某些地方,你想让它更好一点,你会通过订阅Paint事件。

换句话说:当您决定查看类型本身时应该使用OnPaint,而当您决定查看实例时应该使用Paint事件。