Event 문

사용자 정의 이벤트를 선언합니다.

[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _
[ Implements implementslist ]
' -or-
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname As delegatename _
[ Implements implementslist ]
' -or-
 [ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _
[ Implements implementslist ]
   [ <attrlist> ] AddHandler(ByVal value As delegatename)
      [ statements ]
   End AddHandler
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)
      [ statements ]
   End RemoveHandler
   [ <attrlist> ] RaiseEvent(delegatesignature)
      [ statements ]
   End RaiseEvent
End Event

구성 요소

파트

설명

attrlist

선택적 요소로서, 이 이벤트에 적용되는 특성의 목록으로, 특성이 여러 개 있으면 쉼표로 구분됩니다. 특성 목록(Visual Basic)은 꺾쇠괄호("<" 및 ">")로 묶어야 합니다.

accessmodifier

선택적 요소로서, 이벤트에 액세스할 수 있는 코드를 지정합니다. 다음 중 하나일 수 있습니다.

  • Public - 이벤트를 선언한 요소에 액세스할 수 있는 모든 코드에서 이벤트에 액세스할 수 있습니다.

  • Protected - 이벤트의 클래스 및 파생 클래스에 있는 코드에서만 이벤트에 액세스할 수 있습니다.

  • Friend - 동일한 어셈블리에 있는 코드에서만 이벤트에 액세스할 수 있습니다.

  • Private - 이벤트를 선언한 요소 내에 있는 코드에서만 이벤트에 액세스할 수 있습니다.

Protected Friend를 지정하면 이벤트의 클래스, 파생 클래스 또는 동일한 어셈블리에 있는 코드에서 액세스할 수 있습니다.

Shared

선택적 요소로서, 이 이벤트가 클래스 또는 구조체의 특정 인스턴스와 연결되지 않음을 지정합니다.

Shadows

선택적 요소로서, 이 이벤트가 기본 클래스에서 같은 이름의 프로그래밍 요소나 오버로드된 요소 집합을 다시 선언하고 숨김을 나타냅니다. 다른 요소를 사용하여 선언된 모든 요소를 숨길 수 있습니다.

숨겨진 요소는 해당 요소를 숨기는 파생 클래스에서 사용할 수 없지만 숨기는 요소를 액세스할 수 없는 클래스에서는 사용할 수 있습니다. 예를 들어, Private 요소가 기본 클래스 요소를 숨기면 Private 요소에 대한 액세스 권한이 없는 코드는 기본 클래스 요소에 액세스할 수 있습니다.

eventname

필수적 요소로서, 이벤트의 이름이며, 표준 변수 명명 규칙을 따릅니다.

parameterlist

선택적 요소로서, 이 이벤트의 매개 변수를 나타내는 지역 변수의 목록입니다. 매개 변수 목록(Visual Basic)은 괄호로 묶어야 합니다.

Implements

선택적 요소로서, 이 이벤트가 인터페이스의 이벤트를 구현한다는 것을 나타냅니다.

implementslist

Implements문을 사용할 경우 필수적 요소입니다. 구현될 Sub 프로시저 목록입니다. 프로시저가 여러 개 있으면 쉼표로 구분됩니다.

implementedprocedure [ , implementedprocedure ... ]

각 implementedprocedure의 구문과 구성 요소는 다음과 같습니다.

interface.definedname

파트설명
interface 필수적 요소로서,이 프로시저의 포함하는 클래스 또는 구조체에서 구현하는 인터페이스의 이름입니다.
definedname 필수적 요소로서,프로시저를 interface에 정의할 때 사용되는 이름입니다.이 프로시저에서 정의된 프로시저를 구현하는 데 사용하는 이름인 name과 같을 필요는 없습니다.

Custom

필수적 요소로서, Custom으로 선언된 이벤트는 사용자 지정 AddHandler, RemoveHandler 및 RaiseEvent 접근자를 정의해야 합니다.

delegatename

선택적 요소로서, 이벤트 처리기 시그니처를 지정하는 대리자의 이름입니다.

AddHandler

필수적 요소로서, AddHandler 접근자를 선언합니다. 이 접근자는 AddHandler 문을 사용하여 명시적으로 또는 Handles 절을 사용하여 암시적으로 이벤트 처리기를 추가할 때 실행할 문을 지정합니다.

End AddHandler

필수적 요소로서, AddHandler 블록을 종료합니다.

value

필수적 요소로서, 매개 변수 이름입니다.

RemoveHandler

필수적 요소로서, RemoveHandler 접근자를 선언합니다. 이 접근자는 RemoveHandler 문을 사용하여 이벤트 처리기를 제거할 때 실행할 문을 지정합니다.

End RemoveHandler

필수적 요소로서, RemoveHandler 블록을 종료합니다.

RaiseEvent

필수적 요소로서, RaiseEvent 접근자를 선언합니다. 이 접근자는 RaiseEvent 문을 사용하여 이벤트를 발생시킬 때 실행할 문을 지정합니다. 일반적으로 AddHandler 및 RemoveHandler 접근자에 의해 유지되는 대리자의 목록을 호출합니다.

End RaiseEvent

필수적 요소로서, RaiseEvent 블록을 종료합니다.

delegatesignature

필수적 요소로서, delegatename 대리자에 필요한 매개 변수와 일치하는 매개 변수의 목록입니다. 매개 변수 목록(Visual Basic)은 괄호로 묶어야 합니다.

statements

선택적 요소로서, AddHandler, RemoveHandler 및 RaiseEvent 메서드의 본문을 포함하는 문입니다.

End Event

필수적 요소로서, Event 블록을 종료합니다.

설명

이벤트를 선언한 다음 RaiseEvent 문을 사용하여 해당 이벤트를 발생시킵니다. 다음 코드 예제에서처럼 일반적인 이벤트를 선언하고 발생시킬 수 있습니다.

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

참고

프로시저 인수를 선언하는 경우와 같이 이벤트 인수를 선언할 수 있지만, 이벤트는 명명된 인수, ParamArray 인수 또는 Optional 인수를 가질 수 없습니다. 또한 이벤트는 반환 값을 갖지 못합니다.

이벤트를 처리하려면 Handles 문이나 AddHandler 문을 사용하여 해당 이벤트와 이벤트 처리기 서브루틴을 연결해야 합니다. 서브루틴 및 이벤트의 시그니처는 일치해야 합니다. 공유 이벤트를 처리하려면 AddHandler 문을 사용해야 합니다.

Event 키워드는 모듈 수준에서만 사용할 수 있습니다. 즉, 이벤트에 대한 선언 컨텍스트는 클래스, 구조체, 모듈 또는 인터페이스여야 하며 소스 파일, 네임스페이스, 프로시저 또는 블록이 될 수 없습니다. 자세한 내용은 선언 컨텍스트 및 기본 액세스 수준(Visual Basic)을 참조하십시오.

대부분의 경우, 이벤트를 선언할 때 이 항목의 구문 섹션에 있는 첫 번째 구문을 사용할 수 있습니다. 그러나 일부 시나리오에서는 이벤트의 상세한 동작을 보다 많이 제어할 수 있어야 합니다. 이 항목의 구문 섹션에 있는 마지막 구문은 Custom 키워드를 사용하며 사용자 지정 이벤트를 정의할 수 있는 제어를 제공합니다. 사용자 지정 이벤트에서는 코드가 이벤트에서 이벤트 처리기를 추가하거나 제거할 때 또는 코드에서 이벤트를 발생시킬 때 수행되는 동작을 정확하게 지정할 수 있습니다. 예제를 보려면 방법: 메모리를 절약하는 사용자 지정 이벤트 선언(Visual Basic)방법: 차단을 방지하는 사용자 지정 이벤트 선언(Visual Basic)를 참조하십시오.

예제

다음 예제에서는 이벤트를 사용하여 10~0까지 초를 카운트다운합니다. 이 코드는 몇 가지의 이벤트 관련 메서드, 속성 및 문을 보여 줍니다. 여기에는 RaiseEvent 문이 포함됩니다.

이벤트를 발생시키는 클래스는 이벤트 소스이고 해당 이벤트를 처리하는 메서드는 이벤트 처리기입니다. 이벤트 소스에는 생성되는 이벤트에 대한 처리기를 여러 개 가질 수 있습니다. 클래스가 이벤트를 발생시키는 경우 개체의 해당 인스턴스에 대해 이벤트를 처리하도록 선택된 모든 클래스에서 해당 이벤트가 발생합니다.

또한 이 예제에서는 하나의 단추(Button1)와 하나의 텍스트 상자(TextBox1)가 있는 폼(Form1)을 사용합니다. 단추를 클릭하면 첫 번째 텍스트 상자에 10초에서 0초까지의 카운트다운이 표시됩니다. 전체 시간(10초)이 경과하면 첫 번째 텍스트 상자에 "Done"이 표시됩니다.

Form1의 코드는 폼의 초기 상태 및 종료 상태를 지정합니다. 또한 여기에는 이벤트가 발생할 때 실행되는 코드도 포함되어 있습니다.

이 예제를 사용하려면 새 Windows Forms 프로젝트를 엽니다. 하나의 Button1 단추와 하나의 TextBox1 텍스트 상자를 Form1 기본 폼에 추가합니다. 그런 다음 폼을 마우스 오른쪽 단추로 클릭하고 코드 보기를 클릭하여 코드 편집기를 엽니다.

WithEvents 변수를 Form1 클래스의 선언 섹션에 추가합니다.

Private WithEvents mText As TimerState

Form1 코드에 다음 코드를 추가합니다. Form_Load 또는 Button_Click 등과 같이 있을 수 있는 모든 중복 프로시저를 바꿉니다.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double, 
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

F5 키를 눌러 이전 예제를 실행하고 Start 단추를 클릭합니다. 첫 번째 텍스트 상자에 카운트다운이 시작됩니다. 전체 시간(10초)이 경과하면 첫 번째 텍스트 상자에 "Done"이 표시됩니다.

참고

My.Application.DoEvents 메서드에서 이벤트를 처리하는 방법은 폼에서 이벤트를 처리하는 방법과 동일하지 않습니다. 폼에서 이벤트를 직접 처리하도록 하려면 다중 스레딩을 사용합니다. 자세한 내용은 스레딩(C# 및 Visual Basic)을 참조하십시오.

참고 항목

작업

방법: 메모리를 절약하는 사용자 지정 이벤트 선언(Visual Basic)

방법: 차단을 방지하는 사용자 지정 이벤트 선언(Visual Basic)

참조

RaiseEvent 문

Implements 문

AddHandler 문

RemoveHandler 문

Handles 절(Visual Basic)

Delegate 문

Shared(Visual Basic)

Shadows(Visual Basic)

기타 리소스

이벤트(Visual Basic)