Visual Basic (VB.NET)에서 델리게이트는 특정 시그니처를 가진 메서드에 대한 참조를 포함하는 타입이며, 이벤트 처리를 위한 기초가 됩니다. 이벤트는 델리게이트를 기반으로 구축되어 객체가 발생한 변경 사항에 대해 다른 객체에 알릴 수 있도록 합니다.
표준 이벤트는 이미 정의된 델리게이트를 사용하며, 예를 들어 EventHandler가 있습니다. 사용자 정의 이벤트의 경우 필요한 시그니처로 자체 델리게이트를 정의할 수 있습니다:
'사용자 정의 델리게이트 및 이벤트 선언 Public Delegate Sub ChangedEventHandler(sender As Object, e As EventArgs) Public Event Changed As ChangedEventHandler '이벤트 사용 Public Sub OnChanged() RaiseEvent Changed(Me, EventArgs.Empty) End Sub
세부 사항:
왜 Visual Basic에서 이벤트는 클래스 외부에서 호출할 수 없나요, 비록 Public으로 선언되었더라도?
답변: 접근 수정자인 Public에도 불구하고, 이벤트는 클래스 외부에서 "구독"하거나 "구독 취소"만 할 수 있으며, 호출(RaiseEvent)은 오직 클래스 내부에서만 가능합니다 — 이는 언어의 특성으로, 이벤트 발송에 대한 캡슐화 및 제어를 보장합니다. 예를 들어:
Public Class Foo Public Event MyEvent() End Class Dim f As New Foo() ' 이렇게 불가능: f.RaiseEvent MyEvent() — 컴파일러가 이를 허용하지 않습니다.
이야기
Windows Forms 프로젝트: 개발자가 UI를 업데이트하기 위해 데이터 클래스 외부에서 "DataUpdated" 이벤트를 호출하려고 했습니다. 실패하였고 이벤트가 처리되지 않아 아키텍처를 리팩토링하고 잘못된 이해로 인한 로직을 수정해야 했습니다.
이야기
웹 서비스: 델리게이트를 정의할 때 시그니처에 하나의 변수를 누락시켰습니다. 이벤트에 구독되었지만 런타임 오류가 발생했습니다 — 구독자는 하나의 인수를 예상했으나 호출은 두 개로 이루어졌습니다.
이야기
1C 플러그인: 개발자들은 RaiseEvent 호출을 모방하기 위해 FieldInfo.SetValue를 사용했습니다. 이는 인터페이스 상태 불일치와 매끄럽지 않은 빌드 업데이트를 초래했습니다.