2014-01-23 6 views
3

Я заметил, что обработчики событий формы в приложении, над которым я работаю, имеют разные ссылки на объекты: некоторые из них - Me.<event>, а некоторые из них - MyBase.<event>. После небольшого разговора я обнаружил, что события, созданные из окна свойств в конструкторе, заданы ссылкой MyBase, тогда как события, созданные путем их выбора в окне кода, даются ссылкой Me.Почему автоматически вставляются обработчики событий формы разные, в зависимости от того, как они были созданы?

У меня есть read up о различиях между этими двумя ссылками, но на самом деле это не проливает свет на то, почему в этих случаях можно использовать, а не другое. Итак, следует ли беспокоиться о обработчиках событий формы, имеющих разные ссылки? И если да, то какой должен Я использую?

+0

Это происходит в любой конкретной версии Visual Studio? –

+0

@roryap Ну, теперь я использую VS2013 Express, но приложение было создано в VS2010. – Ants1060

ответ

3

Me и MyBase действительно имеют разные значения, но когда вы говорите о обработчиках событий, их можно использовать взаимозаменяемо.

MyBase используется, если вы хотите ссылаться на элемент из базового класса. Это полезно, когда ваш производный класс Overrides имеет некоторый член из вашего базового класса, но вы хотите конкретно назвать реализацию базового класса этого члена, а не свой собственный. Например:

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, где это возможно, добавило бы код, было бы тривиально.

+1

Отличный ответ, спасибо. Мне все еще интересно, есть ли у VB конкретная причина для их создания по-разному, но я думаю, поскольку нет эффективной разницы, когда они используются в качестве обработчиков событий, это может быть просто непреднамеренная аномалия. – Ants1060

+1

Я предполагаю, что это просто надзор со стороны разработчиков VS. Вероятно, различные команды, работающие над этим, приводят к различным поведением, которое никогда не становилось проблемой из-за того, что указал Стивен. –

+0

@roryap Вот что я думал. Хотя это возможно, это может способствовать неправильным представлениям о взаимозаменяемости двух ключевых слов, поэтому было бы лучше, если бы они были последовательными. – Ants1060

Смежные вопросы