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

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

[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] 
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」を参照してください。

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 プロシージャを呼び出すことができます。 Function プロシージャは、Sqrt、Cos、または ChrW などのライブラリ関数と同じ方法で使用します。

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

また、Call ステートメントで関数を呼び出すこともできます。この場合、戻り値は無視されます。

注意

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

規則

  • 戻り値の型。 Function ステートメントは、戻り値のデータ型を宣言できます。 任意のデータ型か、列挙体、構造体、クラス、またはインターフェイスの名前を指定できます。

    returntype を指定しなかった場合は、プロシージャは Object を返します。

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

動作

  • プロシージャから戻るときの動作 Function プロシージャが呼び出し元のコードに戻ると、プロシージャを呼び出したステートメントの次のステートメントから実行が継続します。

    Exit Function ステートメントおよび Return ステートメントは、Function プロシージャを直ちに終了します。 Exit Function ステートメントと Return ステートメントは、プロシージャ内の任意の位置で何回でも指定できます。また Exit Function ステートメントと Return ステートメントを混在して使用できます。

  • 戻り値。 関数から値を返すには、関数名に値を割り当てるか、または Return ステートメントに値を設定します。 戻り値を myFunction という名前の関数に割り当てて、Exit Function ステートメントを使って返すコード例を次に示します。

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

    name に値を割り当てずに Exit Function を使用すると、プロシージャは returntype に指定されたデータ型の既定値を返します。 returntype を指定しないと、プロシージャは Object の既定値である Nothing を返します。

    Return ステートメントは、戻り値を割り当て、同時に関数を終了します。 次に例を示します。

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

トラブルシューティング

  • 実行順序。 Visual Basic では、演算効率を高めるために数式が自動的に並べ替えられることがあります。 このため、変数の値を変えてしまうような Function プロシージャを数式の中で実行しないようにしてください。

使用例

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

参照

処理手順

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

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

参照

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

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

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

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

Of 句 (Visual Basic)

Function 式 (Visual Basic)

概念

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

ラムダ式 (Visual Basic)