Как я могу обработать событие, которое возникает в New? - PullRequest
2 голосов
/ 24 августа 2011

Тестовый случай:

Public Class T
    Public Event A()

    Public Sub New()
        RaiseEvent A()
    End Sub
End Class

Module Module1
    Sub Main()
        Dim obj = New T()
        AddHandler obj.A, AddressOf handleA
    End Sub

    Sub handleA()
        Debug.WriteLine("!")
    End Sub
End Module

Конечно, AddHandler еще не запускался при срабатывании New.

Итак, я попытался так:

Public Class T
    Public Event A()

    Public Sub New()
        RaiseEvent A()
    End Sub
End Class

Module Module1
    Dim WithEvents obj As T

    Sub Main()
        obj = New T()
    End Sub

    Sub handleA() Handles obj.A
        Debug.WriteLine("!")
    End Sub
End Module

Но даже здесь кажется, что обработчик не регистрируется до тех пор, пока не завершится New.

Однако в реальной жизни событие возникает в коде, который семантически является частью инициализации объекта, и я бына самом деле, скорее, не нужно создавать какую-то Initialize функцию.

Есть ли у меня какая-либо другая опция?

Ответы [ 2 ]

8 голосов
/ 24 августа 2011

Нет смысла помещать код, который вызывает событие, в конструктор, если только какой-то другой код, который выполняется внутри того же конструктора, не сможет зарегистрироваться для обработки события (например, через некоторый косвенный вызов метода).Это, в свою очередь, потребует утечки Me до завершения конструктора, что, как правило, является плохой идеей.

В основном: старайтесь избегать этого дизайна.Во время строительства объект не должен быть видимым для внешнего мира, включая обработчики событий.

1 голос
/ 24 августа 2011

Я согласен с Джоном в отношении помещения событий в конструкторы - в частности, потому что стандартный шаблон событий действительно показывает экземпляр отправителя в вызове события, и, как справедливо говорит Джон, это плохая идея.

Однако, это не плохая идея, если вы только раздавать значения.И вы можете сделать это легко.

Попробуйте:

Public Class T
    Public Sub New(a As Action)
        a()
    End Sub
End Class

Module Module1
    Sub Main()
        Dim obj = New T(AddressOf handleA)
    End Sub

    Sub handleA()
        Debug.WriteLine("!")
    End Sub
End Module
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...