Share via


方法: 引数の値渡しを強制する (Visual Basic)

引数を渡す方法は、プロシージャの宣言によって決まります。 パラメーターが ByRef (Visual Basic) で宣言されている場合、Visual Basic は対応する引数が参照渡しで渡されると予測します。 この場合、プロシージャは呼び出し元のコードにある引数の基のプログラミング要素の値を変更できます。 基の要素をこの方法で変更しないように保護する場合は、プロシージャの呼び出し時に引数名をかっこで囲むことによって、ByRef の引数渡しの方法をオーバーライドします。 このかっこは、呼び出し時に引数リストを囲むかっこに追加して記述します。

呼び出し元のコードで ByVal (Visual Basic) の引数渡しの方法をオーバーライドすることはできません。

引数の値渡しを強制するには

  • プロシージャ内で対応するパラメーターが ByVal として宣言されている場合は、それ以上何もする必要はありません。 Visual Basic は、引数が値渡しで渡されることを既に予期しています。

  • プロシージャ内で対応するパラメーターが ByRef で宣言されている場合は、プロシージャの呼び出し時に引数をかっこで囲みます。

使用例

ByRef のパラメーター宣言をオーバーライドする例を次に示します。 ByVal を強制している呼び出しの部分で、かっこが二重に記述されている点に注意してください。

Sub setNewString(ByRef inString As String)
    inString = "This is a new value for the inString argument."
    MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"

' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)

' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)

引数リストの内部で str が二重のかっこに囲まれると、setNewString プロシージャは呼び出し元のコードにあるその値を変更できず、MsgBox に "Cannot be replaced if passed ByVal" と表示します。 str が二重のかっこで囲まれなければ、プロシージャは値を変更でき、MsgBox には "This is a new value for the inString argument" と表示されます。

コードのコンパイル

参照渡しで変数を渡すときには、ByRef キーワードを使って明示的に指定する必要があります。

Visual Basic の既定の設定では、値渡しで引数が渡されます。 ただし、パラメーターを宣言するときには、ByVal (Visual Basic) または ByRef (Visual Basic) のどちらかのキーワードを常に含めるようにすることをお勧めします。 これによって、コードが読みやすくなります。

信頼性の高いプログラミング

プロシージャにパラメーターが ByRef (Visual Basic) で宣言されている場合、そのコードを正しく実行できるかどうかは、呼び出し元のコードにある基の要素を変更できるかどうかに左右されます。 呼び出し元のコードで引数をかっこで囲むことによって、この引数渡しの方法がオーバーライドされた場合、または変更不可能な引数が渡された場合は、プロシージャから基の要素を変更できません。 これによって、呼び出し元のコードで予期しない結果になる場合があります。

セキュリティ

呼び出し元のコードにある引数の基の値をプロシージャから変更できるようにすると、必ず危険が伴います。 変更すべき値が変更されていることを確認し、検証用のコードを作成して値を使用する前にチェックしてください。

参照

処理手順

方法: プロシージャに引数を渡す (Visual Basic)

方法: プロシージャ引数の値を変更する (Visual Basic)

方法: プロシージャ引数の値が変化しないようにする (Visual Basic)

概念

Visual Basic におけるプロシージャ

プロシージャのパラメーターと引数 (Visual Basic)

引数の値渡しと参照渡し (Visual Basic)

変更できる引数と変更できない引数の違い (Visual Basic)

引数の値渡しと参照渡しの違い (Visual Basic)

位置と名前による引数渡し (Visual Basic)

データ型の実装 (Visual Basic)