プロシージャでパラメーターが ByRef として宣言されている場合、Visual Basic はプロシージャ コードに、呼び出し元コードの引数の基になるプログラミング要素への直接参照を提供します。 これにより、プロシージャは呼び出し元のコードの引数の基になる値を変更できます。 場合によっては、呼び出し元のコードでこのような変更から保護することが必要になる場合があります。
プロシージャで対応するパラメーター ByVal を宣言することで、常に変更から引数を保護できます。 一部のケースでは特定の引数を変更できるようにし、他のケースではできないようにしたい場合は、引数をByRef
として宣言し、呼び出し元のコードが各呼び出しの受け渡しメカニズムを決定するようにできます。 これを行うには、対応する引数をかっこで囲んで値として渡すか、かっこで囲まないで参照によって渡します。 詳細については、「 方法: 引数を強制的に値渡しする」を参照してください。
例
次の例は、配列変数を受け取り、その要素を操作する 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
は参照型であるため、渡 increase
メカニズムが ByVal
されている場合でも、そのメンバーを変更できます。
2 番目の MsgBox
呼び出しには、"After replace(n): 11, 21, 31, 41" と表示されます。
n
はByVal
渡されるため、replace
は新しい配列を割り当てることによって呼び出し元のコード内の変数n
を変更することはできません。
replace
新しい配列インスタンスk
を作成し、ローカル変数a
に割り当てると、呼び出し元のコードによって渡されたn
への参照が失われます。
a
のメンバーを変更すると、ローカル配列k
のみが影響を受けます。 したがって、 replace
は、呼び出し元のコード内の配列 n
の値をインクリメントしません。
コードをコンパイルする
Visual Basic の既定値は、引数を値で渡すことです。 ただし、宣言されたすべてのパラメーターに ByVal キーワードまたは ByRef キーワードを含めるのは、プログラミング上の良い方法です。 これにより、コードの読みやすさが高くなります。
こちらも参照ください
.NET