Visual Basic의 이벤트(Events)는 객체가 애플리케이션의 다른 구성 요소에 발생한 변경 사항을 알릴 수 있도록 합니다. 이벤트는 Event 키워드를 사용하여 선언됩니다. RaiseEvent(VB.NET) 또는 Raise(VB6) 메서드를 사용하여 호출하며, 구성 요소는 그에 구독할 수 있습니다(Handles/WithEvents).
VB.NET 예제:
Public Class Worker Public Event WorkCompleted As EventHandler Public Sub DoWork() ' ...작업 수행 RaiseEvent WorkCompleted(Me, EventArgs.Empty) End Sub End Class Public Class Manager Private WithEvents w As Worker Public Sub New() w = New Worker() End Sub Private Sub w_WorkCompleted(sender As Object, e As EventArgs) Handles w.WorkCompleted Console.WriteLine("작업이 완료되었습니다!") End Sub End Class
중요한 점:
WithEvents는 클래스의 필드와 속성에만 사용할 수 있습니다.접근 수정자
Private로 이벤트를 선언하고 다른 클래스에서 구독할 수 있습니까?
답변: 아니요, Private 접근 수정자는 해당 클래스에서만 이벤트의 가시성을 제한합니다. 다른 클래스는 이를 볼 수 없으므로 구독할 수 없습니다.
이야기
대규모 애플리케이션에서 이벤트는
Public수정자로 생성되었지만 명시적으로 구독 해제되지 않았습니다. 애플리케이션이 오래 실행될수록 처리기는 불필요한 개체를 참조하므로 메모리 누수가 발생했습니다.
이야기
VB6에서 VB.NET으로 마이그레이션할 때 개발자는 이벤트가 모든 모듈에서 사용 가능할 것으로 예상했지만, 기본적으로 이벤트는
Friend로 설정되었습니다. 그 결과 처리기가 작동하지 않았고 이 버그는 통합 테스트에서만 발견되었습니다.
이야기
프로그래머가 이벤트 делегат의 시그니처에서
sender와e의 위치를 바꿨습니다. 오류 메시지가 하나도 없었고(이벤트 핸들러가 호출되지 않음), 필요한 비즈니스 로직이 반꼬리 릴리스까지 숨겨져 пропуск됐다.