方法: 引数の値渡しを強制する (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)