谈Form_Load()与OnLoad()的区别

查看别人源代码的时候发现了一段不太熟悉的代码,如下:

自己用常用代码改写后发现运行起来无区别:

由此引发了思考:Form_Load()OnLoad()有什么区别?

经过一番查询,得到答案如下:

MS在制作Form类的时候,定义了Public Event Load(sender As Object, e As EventArgs)这样一个公共事件。如果要发送这个事件,必须RaiseEvent Load(Me, New EventArgs())。那么这个语句写在那里呢,就写在了OnLoad函数里面。而这个OnLoad函数自然是从Window消息处罚产生的。所以一个完整的时间发送顺序是
Windows Message [Load] -> OnLoad -> Form1_Load
那么OnLoadForm1_Load的区别是什么呢?

1
OnLoadOverridable的,也就是说我们如果希望这个Form不要进行Load的操作(包括.NET自己关于Load的操作),那么我们就可重载这个OnLoad函数,但是不执行MyBase.OnLoad(Me, e)。这样我们就完全屏蔽了Load这个事件。

2
OnLoad只能再派生类里面起作用,但是Form1_Load是在外部也可以起作用的。

上面的说法我还不是特别理解,不过对于时间发生顺序感觉讲解的还是比较清楚的,另外

根据关键字Overrides可见,第一段代码重写了基类Base Class的方法,也就是说,Onload事件执行在前,Form_Load()是由Onload所引发的。(仅个人观点,如有错误希望指正!)

根据上文的区别1),下面进行代码试验:

新建一个窗体,输入代码

执行情况是:

仅仅弹出了ONLoad消息框,说明已经屏蔽Load事件!

改写代码如下:

即,增加行MyBase.OnLoad(e),此时弹出2个消息框,即2个事件均成功激活。

这点验证了上文的区别1),对此看看搜到的另一位的说法:

基类中的onload函数会引发事件调用form1_load。如果重新写了onload函数,那么基类中引发事件的代码就不会被执行。

至此,大致明白了两者的区别,对于新手,我认为用Form_Load()已经可以满足要求了。

你可能感兴趣的:(onLoad)