次の方法で共有


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

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

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

proceduremodifiers

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

Shared

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

Shadows

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

Async

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

Iterator

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

name

必須。 プロシージャの名前を指定します。 「宣言された要素の名前 (Visual Basic)」を参照してください。

typeparamlist

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

parameterlist

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

returntype

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

Implements

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

implementslist

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

implementedprocedure [ , implementedprocedure ... ]

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

interface.definedname

指定項目

説明

interface

必須。 このプロシージャの包含クラスまたは構造体で実装されているインターフェイスの名前を指定します。

definedname

必須。 interface の中でプロシージャを定義するために使われている名前を指定します。

Handles

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

eventlist

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

eventspecifier [ , eventspecifier ... ]

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

eventvariable.event

指定項目

説明

eventvariable

必須。 イベントを発生させるクラスまたは構造体のデータ型で宣言されたオブジェクト変数を指定します。

event

必須。 このプロシージャが処理するイベントの名前を指定します。

statements

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

End Function

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

解説

すべての実行可能コードはプロシージャ内に記述する必要があります。 各プロシージャは、クラス、構造体、またはと同時に含まれているクラス、構造体、またはモジュール参照されるモジュール内で宣言されます。

呼び出し元のコードに値を返すには、Function の手順を使用してください; それ以外 Sub の手順を使用します。

関数の定義

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

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

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

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

注意

インライン関数式を定義するには、ラムダ式を使用できます。詳細については、「Function 式 (Visual Basic)」および「ラムダ式 (Visual Basic)」を参照してください。

関数から返されること

呼び出し元のコードは、実装への 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 プロシージャを式の中から呼び出すには、プロシージャ名の後に引数リストをかっこで囲んで指定します。 引数を指定しない場合にのみ、かっこを省略できます。 ただし、かっこを指定した方がコードの読みやすさは向上します。

Sqrt、Cos、または ChrWのようなライブラリ関数を呼び出すこと Function の手順を同じ方法で呼び出します。

また Call のキーワードを使用して関数を呼び出すことができます。 その場合、戻り値は無視されます。 Call のキーワードの使用は、通常は推奨されません。 詳細については、「Call ステートメント (Visual Basic)」を参照してください。

Visual Basic では、演算効率を高めるために数式が自動的に並べ替えられることがあります。 そのため、算術式でも同じ式の関数が変数の値 Function の手順を実行する必要があります。

単一の関数

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

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

注意

最初に発生する、どの場合でも、いずれかが、まだ完全ではない最初に、予期したオブジェクトを検出したときに呼び出し元に Async のプロシージャから制御したり、Async の手順の最後に取得します。

Async 関数は Task または Taskの戻り値の型を持つことができます。 Task の戻り値の型を持つ Async 関数の例を次に示します。

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

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

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

反復子の関数

反復子の 関数は、リストや配列などのコレクションに対するカスタムのイテレーションを実行します。 反復子の関数は、各要素を一つずつ返すために [yield] のステートメントを使用します。 [yield] のステートメントに到達すると、コードの現在の位置が保持されます。 実装は、その場所から反復子関数が呼び出されるときに再起動されます。

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

反復子関数の戻り値の型は IEnumerableIEnumerableIEnumerator、または IEnumeratorのいずれかになります。

詳細については、「反復子 (C# および Visual Basic)」を参照してください。

使用例

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

次のコード例は、上記の例で宣言した関数を呼び出します。

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

Taskの戻り値の型を持つ次の例では、DelayAsync は AsyncFunction です。 DelayAsync に整数を返す Return のステートメントがあります。 したがって Task(Of Integer)の戻り値の型を持つ DelayAsync のニーズの関数の宣言。 戻り値の型が 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)

関連項目

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

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

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

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

Of 句 (Visual Basic)

Function 式 (Visual Basic)

概念

Function プロシージャ (Visual Basic)

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

ラムダ式 (Visual Basic)