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

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

呼び出し元のコードでは、引渡し方法 ByVal をオーバーライドできません。

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

  • 対応するパラメーターがプロシージャで ByVal として宣言されている場合は、追加の手順を実行する必要はありません。 引数は既に値渡しになっています。

  • 対応するパラメーターがプロシージャで 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 に "Cannot be replaced if passed ByVal (ByVal で渡した場合、置き換えることはできません)" と表示されます。 str が追加のかっこで囲まれていない場合、プロシージャは値を変更することができ、MsgBox に "This is a new value for the inString argument (これは inString 引数の新しい値です)" と表示されます。

コードのコンパイル

変数を参照渡しにするときは、ByRef キーワードを使用してこの方法を指定する必要があります。

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

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

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

.NET Framework セキュリティ

プロシージャが呼び出し元のコードの引数の基になる値を変更できるようにする場合、常に潜在的なリスクがあります。 この値が変更されることを想定し、使用前に有効性をチェックする準備をしておく必要があります。

関連項目