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
任意。 次のいずれかの値を指定します。
MustOverride Overrides
NotOverridable Overrides
Shared
任意。 「Shared」を参照してください。
Shadows
任意。 「Shadows」を参照してください。
Async
任意。 「Async」を参照してください。
Iterator
任意。 「Iterator」を参照してください。
name
必須です。 プロシージャの名前。 「 Declared Element Names」を参照してください。
typeparamlist
任意。 ジェネリック プロシージャの型パラメーターの一覧。 「型リスト」を参照してください。
parameterlist
任意。 このプロシージャのパラメーターを表すローカル変数名の一覧。 「パラメーターの一覧」を参照してください。
returntype
Option Strict
がOn
の場合は必ず指定します。 このプロシージャによって返される値のデータ型。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
プロシージャは、Sqrt
、Cos
、ChrW
などの任意のライブラリ関数を呼び出すのと同じ方法で呼び出します。
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
修飾子でマークすることもできます。 これは主に、値を返すことができないイベント ハンドラーに使用します。 Async
Sub
プロシージャは待機できず、Async
Sub
プロシージャの呼び出し元は、Sub
プロシージャによってスローされた例外をキャッチできません。
Async
関数の詳細については、「Async および Await を使用した非同期プログラミング」、「非同期プログラムにおける制御フロー」、「非同期の戻り値の型」を参照してください。
iterator 関数
iterator 関数は、リストや配列など、コレクションに対するカスタムの反復を実行します。 iterator 関数は、Yield ステートメントを使用して、各要素を 1 回に 1 つ返します。 Yield ステートメントに達すると、コードの現在の場所が記憶されます。 次回、iterator 関数が呼び出されると、この位置から実行が再開されます。
For Each...Next ステートメントを使用して、クライアント コードから反復子を呼び出します。
iterator 関数の戻り値の型には、IEnumerable、IEnumerable<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> である Async
Function
です。 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_Click
Sub
プロシージャは、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
関連項目
.NET