引数の値渡しと参照渡しの違い (Visual Basic)
プロシージャに 1 つ以上の引数を渡す場合、各引数は呼び出し元のコードにある基のプログラミング要素に対応付けられます。 この基になる要素の値を渡すこともあれば、要素への参照を渡すこともあります。 これを、値渡しと参照渡しと呼びます。
値渡し
引数を値渡しで渡すには、プロシージャ定義内で対応するパラメーターに ByVal (Visual Basic) キーワードを指定します。 値渡しを使用すると、Visual Basic は基になるプログラミング要素の値をプロシージャ内のローカル変数にコピーします。 プロシージャ コードから呼び出し元のコードにある基の要素にアクセスすることはできません。
参照渡し
引数を参照渡しで渡すには、プロシージャ定義内で対応するパラメーターに ByRef (Visual Basic) キーワードを指定します。 参照渡しを使用すると、Visual Basic は呼び出し元のコードにある基のプログラミング要素を、プロシージャから直接参照できるようにします。
引数渡しの方法と要素の型
値渡しと参照渡しのどちらを選ぶかは、基になる要素の型に応じて決めるわけではありません。 値渡しか参照渡しかによって、Visual Basic がプロシージャ コードに何を提供するかが変わります。 一方、値型か参照型かによって、プログラミング要素がメモリにどのように格納されるかが変わります。
しかし、値渡し/参照渡しと要素の型は無関係ではありません。 参照型の値は、メモリ内の他の場所にあるデータへのポインターです。 つまり、参照型を値渡しで渡すと、プロシージャ コードは基の要素自体にはアクセスできませんが、基の要素のデータをポイントできるようになります。 たとえば、要素が配列変数であった場合、プロシージャ コードは変数そのものにはアクセスできませんが、配列のメンバーにはアクセスできます。
要素の変更
不変要素を引数として渡す場合、ByVal と ByRef のどちらを使用するかに関係なく、プロシージャは呼び出し元のコードにある要素を変更できません。
可変要素の場合の要素のデータ型と引数渡しの方法との関係を次の表に示します。
要素の型 |
ByVal で渡す場合 |
ByRef で渡す場合 |
---|---|---|
値型 (格納されるのは値のみ) |
プロシージャは、変数およびそのメンバーを一切変更できません。 |
プロシージャは、変数およびそのメンバーを変更できます。 |
参照型 (クラスまたは構造体のインスタンスへのポインターを格納) |
プロシージャは、変数を変更することはできませんが、変数が指すインスタンスのメンバーを変更できます。 |
プロシージャは、変数および変数が指すインスタンスのメンバーを変更できます。 |
参照
処理手順
方法: プロシージャに引数を渡す (Visual Basic)
方法: プロシージャ引数の値を変更する (Visual Basic)
方法: プロシージャ引数の値が変化しないようにする (Visual Basic)
方法: 引数の値渡しを強制する (Visual Basic)
概念
プロシージャのパラメーターと引数 (Visual Basic)