方法 : 引数の値渡しを強制する

更新 : 2007 年 11 月

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

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

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

  • プロシージャ内で対応するパラメータが 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 または ByRef のいずれかのキーワードを常に指定することをお勧めします。これによって、コードが読みやすくなります。

堅牢性の高いプログラム

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

セキュリティ

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

参照

処理手順

方法 : プロシージャに引数を渡す

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

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

概念

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

プロシージャのパラメータと引数

引数の値渡しおよび参照渡し

変更できる引数と変更できない引数の違い

引数の値渡しと参照渡しの違い

位置と名前による引数渡し

値型と参照型