VB.NET WithEvents поведение ключевого слова - ограничение компилятора VB.NET?

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

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

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

Ответы

Ответ 1

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

Вот типичное использование 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