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

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

構文

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

指定項目

  • attributelist

    任意。 「属性リスト」を参照してください。

  • accessmodifier

    任意。 次のいずれかの値を指定します。

    Access levels in Visual Basic」を参照してください。

  • proceduremodifiers

    任意。 次のいずれかの値を指定します。

  • Shared

    任意。 「Shared」を参照してください。

  • Shadows

    任意。 「Shadows」を参照してください。

  • Async

    任意。 「Async」を参照してください。

  • Iterator

    任意。 「Iterator」を参照してください。

  • name

    必須です。 プロシージャの名前。 「 Declared Element Names」を参照してください。

  • typeparamlist

    任意。 ジェネリック プロシージャの型パラメーターの一覧。 「型リスト」を参照してください。

  • parameterlist

    任意。 このプロシージャのパラメーターを表すローカル変数名の一覧。 「パラメーターの一覧」を参照してください。

  • returntype

    Option StrictOn の場合は必ず指定します。 このプロシージャによって返される値のデータ型。

  • Implements

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

  • implementslist

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

    implementedprocedure [ , implementedprocedure ... ]

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

    interface.definedname

    パーツ 説明
    interface 必須です。 このプロシージャの含まれているクラスまたは構造体によって実装されたインターフェイスの名前。
    definedname 必須です。 interface の中でプロシージャを定義するために使用する名前。
  • Handles

    任意。 このプロシージャで 1 つ以上の特定のイベントを処理できることを示します。 「Handles」を参照してください。

  • eventlist

    Handles を指定する場合は、必ず指定します。 このプロシージャで処理するイベントの一覧。

    eventspecifier [ , eventspecifier ... ]

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

    eventvariable.event

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

    任意。 このプロシージャ内で実行されるステートメントのブロック。

  • End Function

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

Remarks

すべての実行可能コードは、プロシージャ内になければなりません。 さらに各プロシージャは、含んでいるクラス、構造体、またはモジュールと呼ばれるクラス、構造体、またはモジュール内で宣言します。

呼び出し元のコードに値を返すには、Function プロシージャを使用します。それ以外の場合は、Sub プロシージャを使用します。

関数の定義

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

Function プロシージャは、既定でパブリック アクセスに設定されます。 アクセス修飾子を使用してこれらのアクセス レベルを調整できます。

Function プロシージャでは、プロシージャが返す値のデータ型を宣言できます。 任意のデータ型や、列挙、構造体、クラス、またはインターフェイスの名前を指定できます。 returntype パラメーターを指定しない場合、プロシージャから Object が返されます。

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

注意

ラムダ式を使用して、関数式をインラインで定義できます。 詳細については、「関数式」と「ラムダ式」を参照してください。

関数からの復帰

Function プロシージャが呼び出し元のコードに戻ると、実行は、プロシージャを呼び出したステートメントの後のステートメントから続行されます。

関数から値を返すには、関数名に値を代入するか、Return ステートメントに値を含めることができます。

Return ステートメントでは、次の例に示すように、戻り値を代入して、同時に関数を終了します。

Function MyFunction(ByVal j As Integer) As Double
    Return 3.87 * j
End Function

次の例では、関数名 myFunction に戻り値を代入してから、Exit Function ステートメントを使用して戻ります。

Function MyFunction(ByVal j As Integer) As Double
    MyFunction = 3.87 * j
    Exit Function
End Function

Exit Function および Return ステートメントでは、Function プロシージャがすぐに終了します。 任意の数の Exit Function および Return ステートメントをプロシージャ内の任意の場所に記述でき、Exit Function ステートメントと Return ステートメントを混在させることができます。

name に値を代入せずに Exit Function を使用すると、プロシージャから、returntype に指定したデータ型の既定値が返されます。 returntype を指定していない場合、プロシージャから Nothing が返されます。これは Object の既定値です。

関数の呼び出し

Function プロシージャを呼び出すには、式の中でプロシージャ名の後にかっこで囲んだ引数リストを使用します。 引数を指定しない場合に限り、かっこを省略できます。 ただし、常にかっこを含めると、コードが読みやすくなります。

Function プロシージャは、SqrtCosChrW などの任意のライブラリ関数を呼び出すのと同じ方法で呼び出します。

Call キーワードを使用して関数を呼び出すこともできます。 その場合、戻り値は無視されます。 ほとんどの場合に Call キーワードを使用しないことをお勧めします。 詳細については、「Call ステートメント」を参照してください。

Visual Basic では、内部効率を高めるために算術式が再配置されることがあります。 そのため、関数で同じ式内の変数の値を変更する場合は、算術式で Function プロシージャを使用しないでください。

Async 関数

Async 機能を使用することによって、明示的なコールバックを使用せずに、または複数の関数やラムダ式にわたって手動でコードを分割することなく、非同期メソッドを呼び出すことができます。

関数を Async 修飾子でマークすると、その関数で Await 演算子を使用できます。 制御が Async 関数の Await 式に到達すると、制御が呼び出し元に戻り、待機中のタスクが完了するまで関数の進行が中断されます。 タスクが完了すると、関数で実行を再開できます。

注意

Async プロシージャは、まだ完了していない待機中の最初のオブジェクトが検出されるか、または Async プロシージャの最後に達するか、どちらか先に発生したときに、呼び出し元に戻ります。

Async 関数の戻り値の型には、Task<TResult> または Task を指定できます。 戻り値の型が Task<TResult>Async 関数の例を次に示します。

Async 関数で、ByRef パラメーターを宣言することはできません。

Sub ステートメント を、Async 修飾子でマークすることもできます。 これは主に、値を返すことができないイベント ハンドラーに使用します。 AsyncSub プロシージャは待機できず、AsyncSub プロシージャの呼び出し元は、Sub プロシージャによってスローされた例外をキャッチできません。

Async 関数の詳細については、「Async および Await を使用した非同期プログラミング」、「非同期プログラムにおける制御フロー」、「非同期の戻り値の型」を参照してください。

iterator 関数

iterator 関数は、リストや配列など、コレクションに対するカスタムの反復を実行します。 iterator 関数は、Yield ステートメントを使用して、各要素を 1 回に 1 つ返します。 Yield ステートメントに達すると、コードの現在の場所が記憶されます。 次回、iterator 関数が呼び出されると、この位置から実行が再開されます。

For Each...Next ステートメントを使用して、クライアント コードから反復子を呼び出します。

iterator 関数の戻り値の型には、IEnumerableIEnumerable<T>IEnumerator、または IEnumerator<T> を指定できます。

詳細については、「 反復子」を参照してください。

例 1

次の例では、Function ステートメントを使用して、Function プロシージャの本体を形成する名前、パラメーター、およびコードを宣言しています。 ParamArray 修飾子を使用すると、関数では可変数の引数を受け取ることができます。

Public Function CalcSum(ByVal ParamArray args() As Double) As Double
    CalcSum = 0
    If args.Length <= 0 Then Exit Function
    For i As Integer = 0 To UBound(args, 1)
        CalcSum += args(i)
    Next i
End Function

例 2

次の例では、前の例で宣言した関数を呼び出しています。

Module Module1

    Sub Main()
        ' In the following function call, CalcSum's local variables
        ' are assigned the following values: args(0) = 4, args(1) = 3,
        ' and so on. The displayed sum is 10.
        Dim returnedValue As Double = CalcSum(4, 3, 2, 1)
        Console.WriteLine("Sum: " & returnedValue)
        ' Parameter args accepts zero or more arguments. The sum
        ' displayed by the following statements is 0.
        returnedValue = CalcSum()
        Console.WriteLine("Sum: " & returnedValue)
    End Sub

    Public Function CalcSum(ByVal ParamArray args() As Double) As Double
        CalcSum = 0
        If args.Length <= 0 Then Exit Function
        For i As Integer = 0 To UBound(args, 1)
            CalcSum += args(i)
        Next i
    End Function

End Module

例 3

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

startButton_Click プロシージャは、Async Sub プロシージャの一例です。 DoSomethingAsyncAsync 関数であるため、DoSomethingAsync を呼び出すタスクは、Await DoSomethingAsync() ステートメントに示すように、待機させる必要があります。 startButton_ClickSub プロシージャは、Await 式を使用しているため、Async 修飾子を使用して定義する必要があります。

' 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

関連項目