Sub 문(Visual Basic)

프로시저를 정의하는 이름, 매개 변수 및 코드를 선언합니다 Sub .

Syntax

[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Sub ]
    [ statements ]
End Sub

부분

  • attributelist

    (선택 사항) 특성 목록을 참조하세요.

  • Partial

    (선택 사항) partial 메서드의 정의를 나타냅니다. 부분 메서드를 참조하세요.

  • accessmodifier

    (선택 사항) 다음 중 하나일 수 있습니다.

    Access levels in Visual Basic을 참조하세요.

  • proceduremodifiers

    (선택 사항) 다음 중 하나일 수 있습니다.

  • Shared

    (선택 사항) 공유를 참조하세요.

  • Shadows

    (선택 사항) 그림자를 참조하세요.

  • Async

    (선택 사항) 비동기 를 참조하세요.

  • name

    필수 요소. 프로시저의 이름입니다. Declared Element Names을 참조하세요. 클래스에 대한 생성자 프로시저를 만들려면 프로시저 이름을 키워드로 SubNew 설정합니다. 자세한 내용은 개체 수명: 개체를 만들고 삭제하는 방법을 참조하세요.

  • typeparamlist

    (선택 사항) 제네릭 프로시저의 형식 매개 변수 목록입니다. 형식 목록을 참조하세요.

  • parameterlist

    (선택 사항) 이 프로시저의 매개 변수를 나타내는 지역 변수 이름 목록입니다. 매개 변수 목록을 참조하세요.

  • Implements

    (선택 사항) 이 프로시저가 하나 이상의 Sub 프로시저를 구현한다는 것을 나타냅니다. 각 프로시저는 이 프로시저의 클래스 또는 구조를 포함하는 인터페이스에 정의되어 있습니다. 구현 문을 참조하세요.

  • implementslist

    Implements가 제공된 경우 필수입니다. 구현할 Sub 프로시저 목록입니다.

    implementedprocedure [ , implementedprocedure ... ]

    implementedprocedure에는 다음과 같은 구문과 요소가 있습니다.

    interface.definedname

    부분 Description
    interface 필수 요소. 클래스 또는 구조를 포함하는 이 프로시저에서 구현한 인터페이스의 이름입니다.
    definedname 필수 요소. 프로시저가 interface에 정의되는 이름입니다.
  • Handles

    (선택 사항) 이 프로시저가 하나 이상의 특정 이벤트를 처리할 수 있음을 나타냅니다. 핸들을 참조하세요.

  • eventlist

    Handles가 제공된 경우 필수입니다. 이 프로시저가 처리하는 이벤트 목록입니다.

    eventspecifier [ , eventspecifier ... ]

    eventspecifier에는 다음과 같은 구문과 요소가 있습니다.

    eventvariable.event

    부분 Description
    eventvariable 필수 요소. 이벤트를 발생시키는 클래스 또는 구조체의 데이터 형식으로 선언된 개체 변수입니다.
    event 필수 요소. 이 프로시저가 처리하는 이벤트의 이름입니다.
  • statements

    (선택 사항) 이 프로시저 내에서 실행할 문 블록입니다.

  • End Sub

    이 절차의 정의를 종료합니다.

설명

모든 실행 코드는 프로시저 내에 있어야 합니다. 호출 코드에 Sub 값을 반환하지 않으려면 프로시저를 사용합니다. Function 값을 반환하려는 경우 프로시저를 사용합니다.

하위 프로시저 정의

모듈 수준에서만 프로시저를 정의 Sub 할 수 있습니다. 따라서 하위 프로시저에 대한 선언 컨텍스트는 클래스, 구조체, 모듈 또는 인터페이스여야 하며 원본 파일, 네임스페이스, 프로시저 또는 블록일 수 없습니다. 자세한 내용은 선언 컨텍스트 및 기본 액세스 수준을 참조하세요.

Sub 프로시저는 기본적으로 공용 액세스로 설정됩니다. 액세스 한정자를 사용하여 액세스 수준을 조정할 수 있습니다.

프로시저에서 키워드를 Implements 사용하는 경우 포함하는 클래스 또는 구조체에는 Implements 해당 또는 Structure 문 바로 뒤에 Class 있는 문이 있어야 합니다. 문에는 Implementsimplementslist지정된 각 인터페이스가 포함되어야 합니다. 그러나 인터페이스가 를 정의하는 Sub 이름(의 definedname)은 이 프로시저의 이름(의 name)과 일치하지 않아도 됩니다.

하위 프로시저에서 반환

프로시저가 Sub 호출 코드로 돌아오면 호출된 문 다음에 문을 계속 실행합니다.

다음 예제에서는 프로시저의 반환을 Sub 보여줍니다.

Sub mySub(ByVal q As String)
    Return
End Sub

및 문은 Exit Sub 프로시저에서 즉시 종료됩니다Sub.Return 모든 수의 Exit SubReturn 문은 프로시저의 아무 곳에나 나타날 수 있으며 및 Return 문을 혼합 Exit Sub 할 수 있습니다.

하위 프로시저 호출

문에서 Sub 프로시저 이름을 사용한 다음 인수 목록을 괄호로 사용하여 해당 이름을 따라 프로시저를 호출합니다. 인수를 제공하지 않는 경우에만 괄호를 생략할 수 있습니다. 그러나 항상 괄호를 포함하는 경우 코드를 더 읽을 수 있습니다.

Sub 프로시저와 프로시저에는 Function 매개 변수가 있고 일련의 문을 수행할 수 있습니다. 그러나 프로시저는 Function 값을 반환하고 프로시저는 Sub 반환하지 않습니다. 따라서 식에서 프로시저를 Sub 사용할 수 없습니다.

프로시저를 호출할 Call 때 키워드를 Sub 사용할 수 있지만 대부분의 용도에는 해당 키워드를 사용하지 않는 것이 좋습니다. 자세한 내용은 통화 문을 참조하세요.

Visual Basic은 경우에 따라 산술 식을 다시 정렬하여 내부 효율성을 높입니다. 따라서 인수 목록에 다른 프로시저를 호출하는 식이 포함된 경우 해당 식이 특정 순서로 호출된다고 가정해서는 안 됩니다.

비동기 하위 프로시저

비동기 기능을 사용하면 명시적 콜백을 사용하거나 여러 함수 또는 람다 식 간에 코드를 수동으로 분할하지 않고 비동기 함수를 호출할 수 있습니다.

비동기 한정자로 프로시저를 표시하는 경우 프로시저에서 Await 연산자를 사용할 수 있습니다. 컨트롤이 프로시저의 AwaitAsync 식에 도달하면 컨트롤이 호출자에게 반환되고 대기 중인 작업이 완료될 때까지 프로시저의 진행률이 일시 중단됩니다. 작업이 완료되면 프로시저에서 실행을 다시 시작할 수 있습니다.

참고

Async 아직 완료되지 않은 첫 번째 대기 개체가 발견되거나 프로시저의 Async 끝에 도달하면 프로시저가 호출자에게 반환됩니다. 이 중 첫 번째 개체가 발생합니다.

한정자를 사용하여 함수 문을 표시할 Async 수도 있습니다. 함수는 Async 또는 TaskTask<TResult> 반환 형식을 가질 수 있습니다. 이 항목의 뒷부분에 있는 예제에서는 반환 형식Task<TResult>이 인 함수를 보여줍니다Async.

AsyncSub 프로시저는 주로 값을 반환할 수 없는 이벤트 처리기에 사용됩니다. 프로시저를 AsyncSub 대기할 수 없으며 프로시저의 AsyncSub 호출자는 프로시저가 throw하는 예외를 catch할 Sub 수 없습니다.

프로시저는 AsyncByRef 매개 변수를 선언할 수 없습니다.

프로시저에 대한 Async 자세한 내용은 Async 및 Await를 사용한 비동기 프로그래밍, 비동기 프로그램의 제어 흐름비동기 반환 형식을 참조하세요.

예 1

다음 예제에서는 문을 사용하여 Sub 프로시저 본 Sub 문을 구성하는 이름, 매개 변수 및 코드를 정의합니다.

Sub ComputeArea(ByVal length As Double, ByVal width As Double)
    ' Declare local variable.
    Dim area As Double
    If length = 0 Or width = 0 Then
        ' If either argument = 0 then exit Sub immediately.
        Exit Sub
    End If
    ' Calculate area of rectangle.
    area = length * width
    ' Print area to Immediate window.
    Debug.WriteLine(area)
End Sub

예제 2

다음 예제에서 는 DelayAsyncAsyncFunction 반환 형식 Task<TResult>이 인 입니다. DelayAsync 에는 정수를 반환하는 Return 문이 포함됩니다. 따라서 의 DelayAsync 함수 선언에는 의 반환 형식 Task(Of Integer)이 있어야 합니다. 반환 형식이 이기 Task(Of Integer)때문에 의 식 계산 AwaitDoSomethingAsync 다음 문 Dim result As Integer = Await delayTask과 같이 정수()를 생성합니다.

startButton_Click 프로시저는 프로시저의 예입니다Async Sub. DoSomethingAsync 는 함수이므로 Async 다음 문Await DoSomethingAsync()과 같이 에 대한 호출 DoSomethingAsync 태스크를 대기해야 합니다. 프로시저에는 startButton_ClickSub 식이 Async 있으므로 한정자를 사용하여 프로시저를 Await 정의해야 합니다.

' Imports System.Diagnostics
' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
    Await DoSomethingAsync()
End Sub

Private Async Function DoSomethingAsync() As Task
    Dim delayTask As Task(Of Integer) = DelayAsync()
    Dim result As Integer = Await delayTask

    ' The previous two statements may be combined into
    ' the following statement.
    ' Dim result As Integer = Await DelayAsync()

    Debug.WriteLine("Result: " & result)
End Function

Private Async Function DelayAsync() As Task(Of Integer)
    Await Task.Delay(100)
    Return 5
End Function

'  Output:
'   Result: 5

참고 항목