Sub ステートメント (Visual Basic)

Sub プロシージャを定義する名前、パラメーター、およびコードを宣言します。

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

指定項目

語句

定義

attributelist

省略可能。「属性リスト」を参照してください。

Partial

省略可能。部分メソッドの定義であることを示します。「部分メソッド (Visual Basic)」を参照してください。

accessmodifier

省略可能。次のいずれかになります。

Visual Basic でのアクセス レベル」を参照してください。

proceduremodifiers

省略可能。次のいずれかになります。

Shared

省略可能。「Shared (Visual Basic)」を参照してください。

Shadows

省略可能。「Shadows」を参照してください。

Async

省略可能。[Async]を参照してください。

name

必須。プロシージャの名前を指定します。「宣言された要素の名前 (Visual Basic)」を参照してください。クラスのコンストラクターのプロシージャを作成するには、Sub プロシージャの名前を New キーワードにします。詳細については、「オブジェクトの有効期間: オブジェクトの作成と破棄 (Visual Basic)」を参照してください。

typeparamlist

省略可能。ジェネリック プロシージャの型パラメーターのリストを指定します。「型リスト」を参照してください。

parameterlist

省略可能。このプロシージャのパラメーターを表すローカル変数名のリストを指定します。「パラメーターの一覧 (Visual Basic)」を参照してください。

Implements

省略可能。このプロシージャが 1 つ以上の Sub プロシージャを実装しており、それぞれが、このプロシージャの包含クラスまたは構造体によって実装されているインターフェイスの中で定義されていることを示します。「Implements ステートメント」を参照してください。

implementslist

Implements が指定されている場合は、必ず指定します。実装される Sub プロシージャのリストです。

implementedprocedure [ , implementedprocedure ... ]

implementedprocedure の構文と指定項目は次のとおりです。

interface.definedname

指定項目説明
interface 必須。このプロシージャの包含クラスまたは構造体で実装されているインターフェイスの名前を指定します。
definedname 必須。 interface の中でプロシージャを定義するために使われている名前を指定します。

Handles

省略可能。このプロシージャが 1 つまたは複数の特定イベントを処理できることを示します。「Handles 句 (Visual Basic)」を参照してください。

eventlist

Handles が指定されている場合は、必ず指定します。このプロシージャが処理するイベントのリストを指定します。

eventspecifier [ , eventspecifier ... ]

eventspecifier の構文と指定項目は次のとおりです。

eventvariable.event

指定項目説明
eventvariable 必須。イベントを発生させるクラスまたは構造体のデータ型で宣言されたオブジェクト変数を指定します。
event 必須。このプロシージャが処理するイベントの名前を指定します。

statements

省略可能。このプロシージャ内で実行するステートメントのブロックを指定します。

EndSub

このプロシージャの定義を終了します。

解説

すべての実行可能コードはプロシージャ内に記述する必要があります。呼び出し元のコードに値を返す必要がない場合 Sub の手順を使用します。値を取得するとき Function の手順を使用します。

Subプロシージャの定義

モジュール レベルでのみ Sub のプロシージャを定義できます。したがって、Subプロシージャの宣言コンテキストは、クラス、構造体、モジュール、またはインターフェイスであることが必要で、ソース ファイル、名前空間、プロシージャ、ブロックではありません。詳細については、「宣言コンテキストと既定のアクセス レベル (Visual Basic)」を参照してください。

Sub プロシージャは、既定ではパブリック アクセスになります。アクセス修飾子を使用してアクセス レベルを調整できます。

プロシージャが Implements のキーワードを使用する場合は、包含クラスまたは包含構造体は、Class または Structure のステートメントの後に Implements のステートメントが必要です。Implements のステートメントは implementslistで指定される各インターフェイスを含める必要があります。ただし、インターフェイスが Sub を定義する名前 (definedname) このプロシージャの名前と一致する必要はありません。name)。

Subプロシージャから返されます。

呼び出し元のコードに Sub のプロシージャは、実行が継続を呼び出したステートメントの次のステートメントに継続します。

次の例は、Sub プロシージャから制御を戻す方法を示しています。

Sub mySub(ByVal q As String)
    Return
End Sub 

Exit Sub ステートメントと Return ステートメントは、Sub プロシージャを直ちに終了します。プロシージャの任意の場所に、Exit Sub ステートメントと Return ステートメントを何度でも定義できます。また、Exit Sub ステートメントと Return ステートメントを混在して使用できます。

Subプロシージャの呼び出し

次に、ステートメントでとをかっこで囲んででその名前の後にプロシージャ名を使用して Sub のプロシージャを呼び出します。引数を指定しない場合にのみ、かっこを省略できます。ただし、かっこを指定した方がコードの読みやすさは向上します。

Sub の手順と Function の手順では、パラメーターを使用して、一連のステートメントを実行できます。ただし、Function のプロシージャは値と Sub の手順。したがって、式で Sub のプロシージャを使用できません。

Sub のプロシージャを呼び出しますが、そのキーワードは、ほとんどのの使用は推奨されません Call ときのキーワードを使用できます。詳細については、「Call ステートメント (Visual Basic)」を参照してください。

Visual Basic では、演算効率を高めるために数式が自動的に並べ替えられることがあります。、の引数リストが他のプロシージャを呼び出す式が含まれている場合、その理由で、これらの式を特定の順序で呼び出されると見なさないようにする必要があります。

単一のSubプロシージャ

単一の機能を使用すると、明示的なコールバックを使用せずに非同期の関数を呼び出して、または手動で複数の関数またはラムダ式の間でのコードを切り離して。

[Async] 修飾子の手順にマークを付ける場合、プロシージャで [Await] の演算子を使用できます。コントロールが Async の手順の Await の式に到達すると、コントロールは呼び出し元に戻り、予期されるタスクが完了するまでプロシージャの進行状況は中断されます。タスクが完了すると、実行は、プロシージャに再開できます。

[!メモ]

どちらかが最初に発生する、どのでも、完全では、最初に必要なオブジェクトがまたは Async の手順の最後に到達したときに呼び出し元に Async のプロシージャはを返します。

また Async 修飾子の Function ステートメント (Visual Basic) をマークできます。Async 関数は Task<TResult> または Taskの戻り値の型を持つことができます。このトピックの例では、後で Task<TResult>の戻り値の型を持つ Async 関数を示します。

AsyncSub の手順は、主に値を返すことができないイベント ハンドラーに使用されます。AsyncSub の手順では、待機 AsyncSub のプロシージャの呼び出し元は Sub の手順がスローする例外をキャッチできません。

Async の手順では ByRef のパラメーターを宣言できません。

Async の手順に関する詳細については、Async および Await を使用した非同期プログラミング (C# および Visual Basic)非同期プログラムにおける制御フロー (C# および Visual Basic)非同期の戻り値の型 (C# および Visual Basic)を参照してください。

使用例

次の例では、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

Task<TResult>の戻り値の型を持つ次の例では、DelayAsync は AsyncFunction です。DelayAsync に整数を返す Return のステートメントがあります。したがって、DelayAsync の関数の宣言は Task(Of Integer)の戻り値の型が必要です。戻り値の型が Task(Of Integer)であるため、DoSomethingAsync の Await の式の評価は、次のステートメントでは、整数を生成します: Dim result As Integer = Await delayTask。

startButton_Click の手順では Async Sub の手順の例です。DoSomethingAsync が Async 関数であるため、DoSomethingAsync の呼び出しのタスクは次のステートメントに示すよう待たれなければがあります: Await 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

参照

処理手順

方法: ジェネリック クラスを使用する (Visual Basic)

プロシージャのトラブルシューティング (Visual Basic)

関連項目

Implements ステートメント

Function ステートメント (Visual Basic)

パラメーターの一覧 (Visual Basic)

Dim ステートメント (Visual Basic)

Call ステートメント (Visual Basic)

Of 句 (Visual Basic)

概念

パラメーター配列 (Visual Basic)

部分メソッド (Visual Basic)