方法: プロシージャ引数の値が変化しないようにする (Visual Basic)
プロシージャがパラメーターを ByRef (Visual Basic) で宣言すると、Visual Basic はプロシージャ コードに、呼び出し元のコードの引数の基となるプログラミング要素への直接の参照を追加します。 これにより、プロシージャが呼び出し元のコードの引数の基となる値を変更できます。 場合によっては、呼び出し元のコードがこのような変更を禁止する場合もあります。
引数が変更されるのを防ぐには、プロシージャ内で、対応するパラメーターを ByVal (Visual Basic) で宣言します。 特定の引数を、特定の場合のみ変更するには、この引数を ByRef で宣言し、呼び出し元のコードが、呼び出しのたびに引き渡し方法を決定できるようにします。 対応する引数をかっこで囲むと値で渡され、かっこで囲まないと参照が渡されます。 詳細については、「方法: 引数の値渡しを強制する (Visual Basic)」を参照してください。
使用例
次の例には、配列変数を受け取ってその要素を操作する 2 つのプロシージャがあります。 increase プロシージャは、各要素に単純に 1 を加算します。 replace プロシージャは、新しい配列をパラメーター a() 煮割り当て、各要素に 1 を加算します。 ただし、この新しい配列の代入は、呼び出し元のコードの基の配列変数には反映されません。
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByVal a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
最初の MsgBox の呼び出しでは、"After increase(n): 11, 21, 31, 41" と表示されます。 配列 n は参照型なので、引き渡し方法が ByVal でも、 replace によってこのメンバーを変更できます。
2 番目の MsgBox の呼び出しでは、"After replace(n): 11, 21, 31, 41" と表示されます。 n は ByVal で渡されるので、 replace は呼び出し元のコードで新しい配列を割り当てても変数 n を変更できません。 replace が新しい配列インスタンス k を作成して、これをローカル変数 a に割り当てた場合、呼び出し元のコードが渡した n への参照は失われます。 a のメンバーを変更すると、ローカル配列 k のみが影響を受けます。 したがって、 replace は、呼び出し元のコードにある配列 n の値をインクリメントしません。
コードのコンパイル
Visual Basic の既定の設定では、値渡しで引数が渡されます。 ただし、パラメーターを宣言するときには、ByVal (Visual Basic) または ByRef (Visual Basic) のどちらかのキーワードを常に含めるようにすることをお勧めします。 これによって、コードが読みやすくなります。
参照
処理手順
方法: プロシージャに引数を渡す (Visual Basic)
方法: プロシージャ引数の値を変更する (Visual Basic)
方法: 引数の値渡しを強制する (Visual Basic)
概念
プロシージャのパラメーターと引数 (Visual Basic)