何时重写以及何时订阅委托
本文关键字:何时订 重写 何时 | 更新日期: 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
控件。
引发事件通过委托调用事件处理程序。有关更多信息,请参见处理和引发事件。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
事件。