Vb.net 为什么自动插入的表单事件处理程序不同,这取决于它们的方式';你创造了什么?

Vb.net 为什么自动插入的表单事件处理程序不同,这取决于它们的方式';你创造了什么?,vb.net,winforms,event-handling,Vb.net,Winforms,Event Handling,我注意到我正在处理的应用程序中的表单事件处理程序具有不同的对象引用:其中一些是Me.,一些是MyBase.。在玩了一会儿之后,我发现从设计器的属性窗口创建的事件被赋予了MyBase引用,而通过在代码窗口中选择它们创建的事件被赋予了Me引用 我已经解释了这两个引用之间的差异,但这并没有真正阐明为什么在这些情况下使用一个而不是另一个。那么,我应该担心我的表单事件处理程序具有不同的引用吗?如果是这样的话,我应该使用哪一个呢?Me和MyBase确实有不同的含义,但是当您谈论事件处理程序时,它们可以互换使

我注意到我正在处理的应用程序中的表单事件处理程序具有不同的对象引用:其中一些是
Me.
,一些是
MyBase.
。在玩了一会儿之后,我发现从设计器的属性窗口创建的事件被赋予了
MyBase
引用,而通过在代码窗口中选择它们创建的事件被赋予了
Me
引用


我已经解释了这两个引用之间的差异,但这并没有真正阐明为什么在这些情况下使用一个而不是另一个。那么,我应该担心我的表单事件处理程序具有不同的引用吗?如果是这样的话,我应该使用哪一个呢?

Me
MyBase
确实有不同的含义,但是当您谈论事件处理程序时,它们可以互换使用

MyBase
用于引用基类中的成员。当派生类
覆盖了基类中的某个成员,但您希望专门调用该成员的基类实现而不是自己的实现时,这非常有用。例如:

Public Class MyBaseClass
    Public Overridable Sub DoWork()
        Console.WriteLine("Base")
    End Sub
End Class

Public Class MyDerivedClass
    Inherits MyBaseClass

    Public Overrides Sub DoWork()
        Console.WriteLine("Derived")
    End Sub

    Public Sub Test()
        Me.DoWork()
        MyBase.DoWork()
    End Sub
End Class
调用
MyDerivedClass.Test
方法时,上面的示例将输出以下内容:

Derived
Base
很明显,
Me
MyBase
意味着两种不同的东西。然而,对于事件,在VB.NET中,派生类无法重写由其基类定义的事件。事实上,派生类也无法隐藏事件。如果基类定义了一个事件,那么从它派生的所有类都必须具有与基类中定义的事件完全相同的事件


既然如此,当您在派生类中定义事件处理程序时,无论您是说
Handles Me.MyEvent
还是
Handles MyBase.MyEvent
,都无关紧要。两个类中的事件必须相同,因此区别是没有意义的。我想你可能会说使用
MyBase
更为具体,但我想大多数人都会同意,在可能的情况下,总是使用
MyBase
会增加代码的清晰度是微不足道的。

这会发生在任何特定版本的Visual Studio中吗?@roryap我现在使用的是VS2013 Express,但是这个应用程序最初是在VS2010中创建的。非常好的回答,谢谢。我仍然很好奇VB在不同的地方创建它们是否有特定的原因,但我想既然它们用作事件处理程序时没有有效的区别,那很可能只是无意中的异常。我想这只是VS开发人员的疏忽。可能是不同的团队在做这件事,导致了不同的行为,而这些行为从来没有因为史蒂文所指出的而成为问题。@roryap这就是我所想的。虽然这可能会导致人们对这两个关键字的可互换性产生误解,但如果它们是一致的,肯定会更好。