方法: 引数の値渡しを強制する (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 セキュリティ
プロシージャが呼び出し元のコードの引数の基になる値を変更できるようにする場合、常に潜在的なリスクがあります。 この値が変更されることを想定し、使用前に有効性をチェックする準備をしておく必要があります。
関連項目
.NET