次の方法で共有


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

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

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

呼び出し元のコードの基になる要素が変更可能な要素であり、引数が 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 は参照型であるため、渡 replace メカニズムが ByValされている場合でも、そのメンバーを変更できます。

2 つ目の MsgBox 呼び出しには、"After replace(n): 101, 201, 301" と表示されます。 nByRef渡されるため、replaceは呼び出し元のコード内の変数nを変更し、それに新しい配列を割り当てることができます。 nは参照型であるため、replaceはそのメンバーを変更することもできます。

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

コードをコンパイルする

変数を参照渡しで渡す場合は、 ByRef キーワードを使用してこのメカニズムを指定する必要があります。

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

.NET Framework のセキュリティ

プロシージャが呼び出し元のコードの引数の基になる値を変更できるようにする場合、常に潜在的なリスクがあります。 この値が変更されることを確認し、使用する前に有効かどうかを確認する準備をしてください。

こちらも参照ください