프로그래밍VB.NET 개발자

Visual Basic에서 이벤트(Events) 메커니즘을 설명하고 사용자 정의 이벤트를 생성하는 예를 제시하십시오. 선언 및 구독 시 주의해야 할 점은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변

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로 설정되었습니다. 그 결과 처리기가 작동하지 않았고 이 버그는 통합 테스트에서만 발견되었습니다.


이야기

프로그래머가 이벤트 делегат의 시그니처에서 sendere의 위치를 바꿨습니다. 오류 메시지가 하나도 없었고(이벤트 핸들러가 호출되지 않음), 필요한 비즈니스 로직이 반꼬리 릴리스까지 숨겨져 пропуск됐다.