引数の値渡しと参照渡しの違い (Visual Basic)

プロシージャに 1 つまたは複数の引数を渡す場合、各引数は、呼び出し元のコード内の基になるプログラミング要素に対応します。 この基になる要素の値を渡すことも、それへの参照を渡すこともできます。 これは "引渡し方法" と呼ばれます。

値渡し

引数を "値渡し" するには、プロシージャ定義内の対応するパラメーターに ByVal キーワードを指定します。 この引渡し方法を使用すると、基になるプログラミング要素の値がプロシージャ内のローカル変数に Visual Basic によってコピーされます。 プロシージャコードには、呼び出し元のコード内の基になる要素へのアクセス権がありません。

参照渡し

引数を "参照渡し" するには、プロシージャ定義内の対応するパラメーターに ByRef キーワードを指定します。 この引渡し方法を使用した場合、呼び出し元のコード内の基になるプログラミング要素への直接参照が Visual Basic によってプロシージャに渡されます。

引渡し方法と要素型

引渡し方法を選択することは、基になる要素型を分類することと同じではありません。 値渡しまたは参照渡しでは、Visual Basic によってプロシージャ コードに提供されるものを示します。 値型または参照型では、プログラミング要素がメモリ内に格納される方法を示します。

ただし、引渡し方法と要素型は相互に関連しています。 参照型の値は、メモリ内の別の場所にあるデータを指すポインターです。 つまり、参照型を値渡しすると、プロシージャ コードには、基になる要素自体にアクセスできなくても、基になる要素のデータを指すポインターが用意されます。 たとえば、要素が配列変数である場合、プロシージャ コードから変数自体にアクセスすることはできませんが、配列のメンバーにはアクセスすることができます。

変更する機能

変更できない要素を引数として渡した場合、その要素が ByVal または ByRef のどちらで渡されたかに関係なく、プロシージャでは呼び出し元のコード内のそれを変更することはできません。

変更可能な要素については、次の表に、要素型と引渡し方法のやり取りをまとめてあります。

要素型 ByVal で渡した ByRef で渡した
値型 (値のみを含む) プロシージャでは変数も、そのいずれのメンバーも変更することができません。 プロシージャでは変数とそのメンバーを変更できます。
参照型 (クラスまたは構造体のインスタンスを指すポインターを含む) プロシージャでは変数を変更することはできませんが、それによって参照されているインスタンスのメンバーを変更することはできます。 プロシージャでは変数と、それによって参照されるインスタンスのメンバーを変更できます。

関連項目