次の方法で共有


引数の値渡しと参照渡しの違い

更新 : 2007 年 11 月

プロシージャに 1 つ以上の引数を渡す場合、各引数は呼び出し元のコードにある基のプログラミング要素に対応付けられます。この基になる要素の値を渡すこともあれば、要素への参照を渡すこともあります。これを、値渡しと参照渡しと呼びます。

値渡し

引数を値渡しで渡すには、プロシージャ定義内で対応するパラメータに ByVal キーワードを指定します。値渡しを使用すると、Visual Basic は基になるプログラミング要素の値をプロシージャ内のローカル変数にコピーします。プロシージャ コードから呼び出し元のコードにある基の要素にアクセスすることはできません。

参照渡し

引数を参照渡しで渡すには、プロシージャ定義内で対応するパラメータに ByRef キーワードを指定します。参照渡しを使用すると、Visual Basic は呼び出し元のコードにある基のプログラミング要素を、プロシージャから直接参照できるようにします。

引数渡しの方法と要素の型

値渡しと参照渡しのどちらを選ぶかは、基になる要素の型に応じて決めるわけではありません。値渡しか参照渡しかによって、Visual Basic がプロシージャ コードに何を提供するかが変わります。一方、値型か参照型かによって、プログラミング要素がメモリにどのように格納されるかが変わります。

しかし、値渡し/参照渡しと要素の型は無関係ではありません。参照型の値は、メモリ内の他の場所にあるデータへのポインタです。つまり、参照型を値渡しで渡すと、プロシージャ コードは基の要素自体にはアクセスできませんが、基の要素のデータをポイントできるようになります。たとえば、要素が配列変数であった場合、プロシージャ コードは変数そのものにはアクセスできませんが、配列のメンバにはアクセスできます。

要素の変更

不変要素を引数として渡す場合、ByVal と ByRef のどちらを使用するかに関係なく、プロシージャは呼び出し元のコードにある要素を変更できません。

可変要素の場合の要素のデータ型と引数渡しの方法との関係を次の表に示します。

要素の型

ByVal で渡す場合

ByRef で渡す場合

値型 (格納されるのは値のみ)

プロシージャは、変数およびそのメンバを一切変更できません。

プロシージャは、変数およびそのメンバを変更できます。

参照型 (クラスまたは構造体のインスタンスへのポインタを格納)

プロシージャは、変数を変更することはできませんが、変数が指すインスタンスのメンバを変更できます。

プロシージャは、変数および変数が指すインスタンスのメンバを変更できます。

参照

処理手順

方法 : プロシージャに引数を渡す

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

方法 : プロシージャ引数の値が変化しないようにする

方法 : 引数の値渡しを強制する

概念

Visual Basic におけるプロシージャ

プロシージャのパラメータと引数

引数の値渡しおよび参照渡し

変更できる引数と変更できない引数の違い

位置と名前による引数渡し

値型と参照型