Поведение ключевых слов в VB.NET WithEvents - ограничение компилятора VB.NET? - PullRequest
15 голосов
/ 08 мая 2009

Я работаю над тем, чтобы стать таким же знакомым с C #, как и с VB.NET (язык, используемый на моем рабочем месте). Одна из лучших особенностей процесса обучения заключается в том, что, изучая другой язык, вы, как правило, узнаете больше о своем основном языке - всплывают такие маленькие вопросы, как:

Согласно источникам, которые я нашел, и прошлому опыту, поле в VB.NET, объявленное как WithEvents , способно вызывать события. Я понимаю, что C # не имеет прямого эквивалента - но мой вопрос: поля без это ключевое слово в VB.NET не может вызывать события, есть ли способ создать такое же поведение в C #? Компилятор VB просто блокирует эти объекты от обработки их событий (фактически позволяя им вызывать события как обычно)?

Мне просто любопытно; У меня нет особой заявки на этот вопрос ...

1 Ответ

20 голосов
/ 08 мая 2009

Пропуск WithEvents не блокирует участников от создания событий. Это просто мешает вам использовать ключевое слово «ручки» в их событиях.

Вот типичное использование WithEvents:

Class C1
    Public WithEvents ev As New EventThrower()
    Public Sub catcher() Handles ev.event
        Debug.print("Event")
    End Sub
End Class

Вот класс, который не использует WithEvents и приблизительно эквивалентен. Это демонстрирует, почему WithEvents весьма полезен:

Class C2
    Private _ev As EventThrower
    Public Property ev() As EventThrower

        Get
            Return _ev
        End Get

        Set(ByVal value As EventThrower)
            If _ev IsNot Nothing Then
                    removehandler _ev.event, addressof catcher
            End If
            _ev = value
            If _ev IsNot Nothing Then
                    addhandler _ev.event, addressof catcher
            End If
        End Set
    End Property

    Public Sub New()
        ev = New EventThrower()
    End Sub

    Public Sub catcher()
        Debug.print("Event")
    End Sub
End Class
...