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

Function プロシージャを定義する名前、パラメーター、およびコードを宣言します。Declares the name, parameters, and code that define a Function procedure.


[ <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

    省略可。Optional. 属性リスト」を参照してください。See Attribute List.

  • accessmodifier

    省略可。Optional. 次のいずれかになります。Can be one of the following:

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

  • proceduremodifiers

    省略可。Optional. 次のいずれかになります。Can be one of the following:

  • Shared

    省略可。Optional. Shared」を参照してください。See Shared.

  • Shadows

    省略可。Optional. Shadows」を参照してください。See Shadows.

  • Async

    省略可。Optional. Async」を参照してください。See Async.

  • Iterator

    省略可。Optional. 反復子」を参照してください。See Iterator.

  • name

    必須。Required. プロシージャの名前。Name of the procedure. 宣言された要素の名前」を参照してください。See Declared Element Names.

  • typeparamlist

    省略可。Optional. ジェネリックプロシージャの型パラメーターのリスト。List of type parameters for a generic procedure. 型リストを参照してください。See Type List.

  • parameterlist

    省略可。Optional. このプロシージャのパラメーターを表すローカル変数名の一覧。List of local variable names representing the parameters of this procedure. パラメーターリスト」を参照してください。See Parameter List.

  • returntype

    Option StrictOnの場合は必須です。Required if Option Strict is On. このプロシージャによって返される値のデータ型。Data type of the value returned by this procedure.

  • Implements

    省略可。Optional. このプロシージャが1つ以上の Function プロシージャを実装することを示します。各プロシージャは、このプロシージャのクラスまたは構造体を含むインターフェイスで定義されています。Indicates that this procedure implements one or more Function procedures, each one defined in an interface implemented by this procedure's containing class or structure. Implements ステートメント」を参照してください。See Implements Statement.

  • implementslist

    Implements を指定する場合は、必ず指定します。Required if Implements is supplied. 実装される Function プロシージャのリストです。List of Function procedures being implemented.

    implementedprocedure [ , implementedprocedure ... ]

    implementedprocedure の構文と指定項目は次のとおりです。Each implementedprocedure has the following syntax and parts:


    要素Part 説明Description
    interface 必須。Required. このプロシージャのクラスまたは構造体によって実装されるインターフェイスの名前。Name of an interface implemented by this procedure's containing class or structure.
    definedname 必須。Required. interface の中でプロシージャを定義するために使用する名前。Name by which the procedure is defined in interface.
  • Handles

    省略可。Optional. このプロシージャが 1 つ以上の特定のイベントを処理できることを示します。Indicates that this procedure can handle one or more specific events. Handles 句」を参照してください。See Handles.

  • eventlist

    Handles を指定する場合は、必ず指定します。Required if Handles is supplied. このプロシージャが処理するイベントの一覧です。List of events this procedure handles.

    eventspecifier [ , eventspecifier ... ]

    eventspecifier の構文と指定項目は次のとおりです。Each eventspecifier has the following syntax and parts:


    要素Part 説明Description
    eventvariable 必須。Required. イベントを発生させるクラスまたは構造体のデータ型で宣言されたオブジェクト変数。Object variable declared with the data type of the class or structure that raises the event.
    event 必須。Required. このプロシージャが処理するイベントの名前。Name of the event this procedure handles.
  • statements

    省略可。Optional. このプロシージャ内で実行されるステートメントのブロック。Block of statements to be executed within this procedure.

  • End Function

    このプロシージャの定義を終了します。Terminates the definition of this procedure.


すべての実行可能コードは、プロシージャ内になければなりません。All executable code must be inside a procedure. 各プロシージャは、クラス、構造体、またはそれを含んでいるクラス、構造体、またはモジュールと呼ばれるモジュール内で宣言されます。Each procedure, in turn, is declared within a class, a structure, or a module that is referred to as the containing class, structure, or module.

呼び出し元のコードに値を返すには、Function プロシージャを使用します。それ以外の場合は、Sub プロシージャを使用します。To return a value to the calling code, use a Function procedure; otherwise, use a Sub procedure.

関数の定義Defining a Function

Function プロシージャは、モジュールレベルでのみ定義できます。You can define a Function procedure only at the module level. したがって、関数の宣言コンテキストは、クラス、構造体、モジュール、またはインターフェイスである必要があり、ソースファイル、名前空間、プロシージャ、またはブロックにすることはできません。Therefore, the declaration context for a function must be a class, a structure, a module, or an interface and can't be a source file, a namespace, a procedure, or a block. 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。For more information, see Declaration Contexts and Default Access Levels.

Function プロシージャは、既定でパブリックアクセスになります。Function procedures default to public access. アクセス修飾子を使用してこれらのアクセス レベルを調整できます。You can adjust their access levels with the access modifiers.

Function プロシージャでは、プロシージャが返す値のデータ型を宣言できます。A Function procedure can declare the data type of the value that the procedure returns. 任意のデータ型を指定することも、列挙体、構造体、クラス、またはインターフェイスの名前を指定することもできます。You can specify any data type or the name of an enumeration, a structure, a class, or an interface. returntype パラメーターを指定しない場合、プロシージャは Objectを返します。If you don't specify the returntype parameter, the procedure returns Object.

このプロシージャで Implements キーワードを使用する場合、含まれるクラスまたは構造体には、その Class または Structure ステートメントの直後にある Implements ステートメントも含まれている必要があります。If this procedure uses the Implements keyword, the containing class or structure must also have an Implements statement that immediately follows its Class or Structure statement. Implements ステートメントには、implementslistで指定されている各インターフェイスを含める必要があります。The Implements statement must include each interface that's specified in implementslist. ただし、インターフェイスが Function (definedname) を定義する際には、このプロシージャの名前 (name) と一致する必要はありません。However, the name by which an interface defines the Function (in definedname) doesn't need to match the name of this procedure (in name).


ラムダ式を使用して、Function 式をインラインで定義できます。You can use lambda expressions to define function expressions inline. 詳細については、「Function 式」および「ラムダ式」を参照してください。For more information, see Function Expression and Lambda Expressions.

関数からの戻りReturning from a Function

Function プロシージャが呼び出し元のコードに戻ると、プロシージャを呼び出したステートメントの後のステートメントで実行が続行されます。When the Function procedure returns to the calling code, execution continues with the statement that follows the statement that called the procedure.

関数から値を返すには、関数名に値を割り当てるか、Return ステートメントに値を含めることができます。To return a value from a function, you can either assign the value to the function name or include it in a Return statement.

次の例に示すように、Return ステートメントは、戻り値を同時に割り当てて関数を終了します。The Return statement simultaneously assigns the return value and exits the function, as the following example shows.

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

次の例では、関数名 myFunction に戻り値を代入し、Exit Function ステートメントを使用してを返します。The following example assigns the return value to the function name myFunction and then uses the Exit Function statement to return.

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

Exit Function ステートメントおよび Return ステートメントを行うと、Function プロシージャからすぐに終了します。The Exit Function and Return statements cause an immediate exit from a Function procedure. プロシージャ内の任意の場所で任意の数の Exit Function および Return ステートメントを使用できます。また、Exit FunctionReturn のステートメントを混在させることができます。Any number of Exit Function and Return statements can appear anywhere in the procedure, and you can mix Exit Function and Return statements.

nameに値を割り当てずに Exit Function を使用する場合、プロシージャは returntypeで指定されたデータ型の既定値を返します。If you use Exit Function without assigning a value to name, the procedure returns the default value for the data type that's specified in returntype. returntype が指定されていない場合、プロシージャは Nothingを返します。これは Objectの既定値です。If returntype isn't specified, the procedure returns Nothing, which is the default value for Object.

関数の呼び出しCalling a Function

Function プロシージャを呼び出すには、式の中でプロシージャ名の後にかっこで囲んだ引数リストを使用します。You call a Function procedure by using the procedure name, followed by the argument list in parentheses, in an expression. かっこを省略できるのは、引数を指定しない場合のみです。You can omit the parentheses only if you aren't supplying any arguments. ただし、常にかっこを含めると、コードが読みやすくなります。However, your code is more readable if you always include the parentheses.

Function プロシージャは、SqrtCosChrWなどのライブラリ関数を呼び出すのと同じ方法で呼び出すことができます。You call a Function procedure the same way that you call any library function such as Sqrt, Cos, or ChrW.

Call キーワードを使用して関数を呼び出すこともできます。You can also call a function by using the Call keyword. その場合、戻り値は無視されます。In that case, the return value is ignored. ほとんどの場合、Call キーワードの使用は推奨されていません。Use of the Call keyword isn't recommended in most cases. 詳細については、「Call ステートメント」を参照してください。For more information, see Call Statement.

Visual Basic は、内部効率を向上させるために算術式を再配置することがあります。Visual Basic sometimes rearranges arithmetic expressions to increase internal efficiency. そのため、関数が同じ式の変数の値を変更する場合は、算術式で Function プロシージャを使用しないでください。For that reason, you shouldn't use a Function procedure in an arithmetic expression when the function changes the value of variables in the same expression.

非同期関数Async Functions

非同期機能を使用すると、明示的なコールバックを使用したり、複数の関数やラムダ式に手動でコードを分割したりすることなく、非同期関数を呼び出すことができます。The Async feature allows you to invoke asynchronous functions without using explicit callbacks or manually splitting your code across multiple functions or lambda expressions.

関数にAsync修飾子を指定した場合は、関数でAwait演算子を使用できます。If you mark a function with the Async modifier, you can use the Await operator in the function. コントロールが Async 関数の Await 式に到達すると、コントロールは呼び出し元に戻り、待機中のタスクが完了するまで、関数の進行状況は中断されます。When control reaches an Await expression in the Async function, control returns to the caller, and progress in the function is suspended until the awaited task completes. タスクが完了すると、関数で実行が再開されます。When the task is complete, execution can resume in the function.


Async プロシージャは、まだ完了していない最初の待機中のオブジェクトが検出されたとき、または Async プロシージャの最後に到達したときに、呼び出し元に返されます。An Async procedure returns to the caller when either it encounters the first awaited object that’s not yet complete, or it gets to the end of the Async procedure, whichever occurs first.

Async 関数は、Task<TResult> または Taskの戻り値の型を持つことができます。An Async function can have a return type of Task<TResult> or Task. 戻り値の型が Task<TResult>Async 関数の例を次に示します。An example of an Async function that has a return type of Task<TResult> is provided below.

Async 関数でByRefパラメーターを宣言することはできません。An Async function cannot declare any ByRef parameters.

Sub ステートメントAsync 修飾子でマークすることもできます。A Sub Statement can also be marked with the Async modifier. これは主に、値を返すことができないイベントハンドラーに使用されます。This is primarily used for event handlers, where a value cannot be returned. Async Sub プロシージャは待機できません。また、AsyncSub プロシージャの呼び出し元は、Sub プロシージャによってスローされた例外をキャッチできません。An Async Sub procedure can't be awaited, and the caller of an Async Sub procedure can't catch exceptions that are thrown by the Sub procedure.

Async 関数の詳細については、「async および Await を使用した非同期プログラミング」、「非同期プログラムでの制御フロー」、および「非同期の戻り値の型」を参照してください。For more information about Async functions, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

反復子メソッドIterator Functions

反復子関数は、リストや配列などのコレクションに対してカスタムの反復処理を実行します。An iterator function performs a custom iteration over a collection, such as a list or array. Iterator 関数は Yieldステートメントを使用して、各要素を 1 回に 1 つ返します。An iterator function uses the Yield statement to return each element one at a time. Yieldステートメントに到達すると、コード内の現在の場所が記憶されます。When a Yield statement is reached, the current location in code is remembered. 次回、反復子メソッドが呼び出されると、この位置から実行が再開されます。Execution is restarted from that location the next time the iterator function is called.

For Each...Nextステートメントを使用して、クライアントコードから反復子を呼び出します。You call an iterator from client code by using a For Each…Next statement.

反復子関数の戻り値の型には、IEnumerableIEnumerable<T>IEnumerator、または IEnumerator<T>を指定できます。The return type of an iterator function can be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

詳細については、「反復子」をご覧ください。For more information, see Iterators.


次の例では、Function ステートメントを使用して、Function プロシージャの本体を形成する名前、パラメーター、およびコードを宣言します。The following example uses the Function statement to declare the name, parameters, and code that form the body of a Function procedure. ParamArray 修飾子を使用すると、関数は可変個の引数を受け取ることができます。The ParamArray modifier enables the function to accept a variable number of arguments.

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


次の例では、前の例で宣言した関数を呼び出します。The following example invokes the function declared in the preceding example.

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


次の例では、DelayAsync は、戻り値の型が Task<TResult>Async Function です。In the following example, DelayAsync is an Async Function that has a return type of Task<TResult>. DelayAsync には、整数を返す Return ステートメントがあります。DelayAsync has a Return statement that returns an integer. したがって、DelayAsync の関数宣言は、戻り値の型 Task(Of Integer)である必要があります。Therefore the function declaration of DelayAsync needs to have a return type of Task(Of Integer). 戻り値の型が Task(Of Integer)ので、DoSomethingAsync 内の Await 式の評価では整数が生成されます。Because the return type is Task(Of Integer), the evaluation of the Await expression in DoSomethingAsync produces an integer. これについては、次のステートメントを Dim result As Integer = Await delayTaskます。This is demonstrated in this statement: Dim result As Integer = Await delayTask.

startButton_Click プロシージャは、Async Sub プロシージャの一例です。The startButton_Click procedure is an example of an Async Sub procedure. DoSomethingAsyncAsync 関数であるため、次のステートメントで示すように、DoSomethingAsync を呼び出すためのタスクを待機する必要があります。 Await DoSomethingAsync()Because DoSomethingAsync is an Async function, the task for the call to DoSomethingAsync must be awaited, as the following statement demonstrates: Await DoSomethingAsync(). startButton_Click Sub プロシージャには Await 式があるため、Async 修飾子を使用して定義する必要があります。The startButton_Click Sub procedure must be defined with the Async modifier because it has an Await expression.

' 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

参照See also