Visual Basic .NET에서 делегаты(Delegate)는 메소드에 대한 참조를 캡슐화하는 객체이고, 이벤트(Events)는 특정 조건이나 변경 사항에 대해 구독자에게 알리는 메커니즘입니다. делегаты는 "동작(메소드)를" 매개변수로 전달할 수 있게 해주고, события는 발행자-구독자 패턴을 구현합니다.
특징:
Event 키워드를 사용하여 선언됩니다.AddHandler를 통해 이루어지고, 탈퇴는 RemoveHandler를 통해 이루어집니다.예:
' делегат 정의 Public Delegate Sub NotifyHandler(ByVal message As String) ' 이벤트가 있는 클래스 Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("작업 완료!") End Sub End Class ' 구독 및 호출 Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()
이벤트는 UI 프로그래밍 및 비즈니스 로직 디스패치에 특히 유용합니다.
이벤트 RaiseEvent를 호출했는데 구독자가 없다면 어떻게 됩니까?
잘못된 답변: 런타임 오류가 발생합니다.
정확한 답변: 아무런 일이 일어나지 않습니다 — 이벤트에 구독자가 없으면 RaiseEvent 호출은 안전하며 예외가 발생하지 않습니다.
예:
Public Event OnUpdate() ' 아무도 구독하지 않았다 하더라도 RaiseEvent 호출: RaiseEvent OnUpdate() ' 허용되며 오류를 발생시키지 않음
이야기
대규모 데스크톱 애플리케이션에서 개발자가 이벤트의 처리기를 해제하지 않아 객체가 가비지 컬렉터에 의해 해제되지 않았습니다 (메모리 누수). 이는 메모리 증가 및 몇 시간 후 시스템 충돌로 이어졌습니다.
이야기
젊은 전문가가 делегаты와 이벤트의 작동 방식을 이해하지 못하여 하나의 메소드를 여러 번 연속으로 구독했습니다. 이는 동일한 처리기가 여러 번 호출되게 하여 사용자에게 중복 알림이 전달되었습니다.
이야기
하나의 프로젝트에서RaiseEvent를 호출하여 그것이 반드시 작동할 것이라고 가정했습니다. 테스트 중 구독자가 없으면 아무런 효과가 없다는 것을 발견하여 애플리케이션 비즈니스 로직의 혼란과 보고서 오류로 이어졌습니다.