プロシージャ宣言によって、受け渡しメカニズムが決まります。 パラメーターが ByRef として宣言されている場合、Visual Basic は、対応する引数を参照渡しすることを想定しています。 これにより、プロシージャは呼び出し元のコードの引数の基になるプログラミング要素の値を変更できます。 このような変更から基になる要素を保護する場合は、引数名をかっこで囲んでプロシージャ呼び出しの ByRef
渡しメカニズムをオーバーライドできます。 これらのかっこは、呼び出しの引数リストを囲むかっこに加えてあります。
呼び出し元のコードは ByVal メカニズムをオーバーライドできません。
引数を強制的に値渡しするには
対応するパラメーターがプロシージャ内
ByVal
宣言されている場合は、追加の手順を実行する必要はありません。 Visual Basic では、引数を値渡しすることが既に想定されています。対応するパラメーターがプロシージャ
ByRef
宣言されている場合は、プロシージャ呼び出しで引数をかっこで囲みます。
例
次の例では、 ByRef
パラメーター宣言をオーバーライドします。
ByVal
を強制する呼び出しでは、かっこの 2 つのレベルに注意してください。
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
は "ByVal 渡された場合に置換できません" と表示されます。
str
が余分なかっこで囲まれていない場合、プロシージャはそれを変更でき、MsgBox
は "inString 引数の新しい値です" と表示されます。
コードをコンパイルする
変数を参照渡しで渡す場合は、 ByRef
キーワードを使用してこのメカニズムを指定する必要があります。
Visual Basic の既定値は、引数を値で渡すことです。 ただし、宣言されたすべてのパラメーターに ByVal キーワードまたは ByRef キーワードを含めるのは、プログラミング上の良い方法です。 これにより、コードの読みやすさが高くなります。
堅牢なプログラミング
プロシージャでパラメーター ByRef が宣言されている場合、コードの正しい実行は、呼び出し元のコードの基になる要素を変更できるかどうかによって異なる場合があります。 呼び出し元のコードが引数をかっこで囲んでこの呼び出しメカニズムをオーバーライドする場合、または変更できない引数を渡した場合、プロシージャは基になる要素を変更できません。 これにより、呼び出し元のコードに予期しない結果が生じる可能性があります。
.NET Framework のセキュリティ
プロシージャが呼び出し元のコードの引数の基になる値を変更できるようにする場合、常に潜在的なリスクがあります。 この値が変更されることを確認し、使用する前に有効かどうかを確認する準備をしてください。
こちらも参照ください
.NET