次の方法で共有


方法: プロシージャ引数を値の変更から保護する (Visual Basic)

プロシージャでパラメーターが 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" と表示されます。 nByVal渡されるため、replaceは新しい配列を割り当てることによって呼び出し元のコード内の変数nを変更することはできません。 replace新しい配列インスタンスkを作成し、ローカル変数aに割り当てると、呼び出し元のコードによって渡されたnへの参照が失われます。 aのメンバーを変更すると、ローカル配列kのみが影響を受けます。 したがって、 replace は、呼び出し元のコード内の配列 n の値をインクリメントしません。

コードをコンパイルする

Visual Basic の既定値は、引数を値で渡すことです。 ただし、宣言されたすべてのパラメーターに ByVal キーワードまたは ByRef キーワードを含めるのは、プログラミング上の良い方法です。 これにより、コードの読みやすさが高くなります。

こちらも参照ください