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

プロシージャを呼び出すときに、指定する引数は、プロシージャで定義されているパラメーターにそれぞれ対応しています。 プロシージャ コードが、呼び出し元のコードの引数の基になる値を変更できる場合があります。 また、プロシージャが引数のローカル コピーのみを変更できる場合もあります。

Visual Basic では、プロシージャを呼び出すときに、ByVal で渡されるすべての引数のローカル コピーが作成されます。 ByRef で渡される各引数では、引数の基になる呼び出し元のコードのプログラミング要素への直接参照がプロシージャ コードに渡されます。

呼び出し元のコードの基になる要素が変更可能な要素であり、引数が ByRef で渡される場合、プロシージャ コードは直接参照を使用して呼び出し元のコードの要素の値を変更できます。

基になる値を変更する

呼び出し元のコードのプロシージャ引数の基になる値を変更するには

  1. プロシージャの宣言で、引数に対応するパラメーターに ByRef を指定します。

  2. 呼び出し元のコードで、変更可能なプログラミング要素を引数として渡します。

  3. 呼び出し元のコードでは、引数リストの引数をかっこで囲まないでください。

  4. プロシージャ コードで、パラメーター名を使用して、呼び出し元のコードの基になる要素に値を割り当てます。

デモについては、後述の例を参照してください。

ローカル コピーを変更する

呼び出し元のコードの基になる要素が変更不可能な要素である場合や、引数が ByVal で渡される場合、プロシージャは呼び出し元のコードの値を変更することはできません。 ただし、プロシージャはそのような引数のローカル コピーを変更できます。

プロシージャ コードのプロシージャ引数のコピーを変更するには

  1. プロシージャの宣言で、引数に対応するパラメーターに ByVal を指定します。

    \- または -

    呼び出し元のコードで、引数リストの引数をかっこで囲みます。 これにより、対応するパラメーターに ByRef が指定されている場合でも、引数の値渡しが強制されます。

  2. プロシージャ コードで、パラメーター名を使用して、引数のローカル コピーに値を割り当てます。 呼び出し元のコードの基になる値は変更されません。

次の例は、配列変数を受け取り、その要素を操作する 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(ByRef 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): 101, 201, 301" と表示されます。 nByRef で渡されるため、replace は呼び出し元のコードの変数 n を変更して新しい配列を割り当てることができます。 n は参照型であるため、replace はそのメンバーを変更することもできます。

プロシージャが、呼び出し元のコードの変数自体を変更できないようにすることができます。 「方法:プロシージャ引数の値が変更されないように保護する」をご覧ください。

コードのコンパイル

変数を参照渡しにするときは、ByRef キーワードを使用してこの方法を指定する必要があります。

Visual Basic の既定では、引数は値渡しになります。 ただし、宣言されるすべてのパラメーターに、ByVal または ByRef キーワードを含めることをお勧めします。 これにより、コードが読みやすくなります。

.NET Framework セキュリティ

プロシージャが呼び出し元のコードの引数の基になる値を変更できるようにする場合、常に潜在的なリスクがあります。 この値が変更されることを想定し、使用前に有効性をチェックする準備をしておく必要があります。

関連項目