引数の値渡しおよび参照渡し
更新 : 2007 年 11 月
Visual Basic では、値渡しまたは参照渡しで引数をプロシージャに渡すことができます。これは引渡し方法と呼ばれ、引数の基となる、呼び出し元のコードのプログラミング要素をプロシージャが変更できるかどうかが決まります。プロシージャの宣言では、ByVal または ByRef キーワードを指定することで、各パラメータの引き渡し方法を決定します。
引き渡し方法の違い
引数をプロシージャに渡す場合、2 つの引き渡し方法の違いに注意してください。
基になるプログラミング要素が変更可能か変更不可能か
引数自体が変更可能か変更不可能か
引数が値渡しか参照渡しか
引数のデータ型が値型か参照型か
詳細については、「変更できる引数と変更できない引数の違い」および「引数の値渡しと参照渡しの違い」を参照してください。
引数渡しの方法の選択
各引数の引き渡し方法は慎重に決定してください。
保護.引数を渡す方法を選択するときに最も重要な基準となるのは、呼び出し元のコードの変数を変更できるようにするかどうかです。ByRef で引数を渡す場合の利点は、プロシージャから呼び出し元のコードに引数を通じて値を返すことができるという点にあります。一方、ByVal を使用する利点は、プロシージャによって変数が変更されるのを防ぐことができるという点にあります。
パフォーマンス.どちらの方法を使用するかによってコードのパフォーマンスが変わってきますが、その差は一般にごくわずかです。ただし、値型を ByVal で渡す場合は例外です。この場合は、引数の内容がすべてコピーされます。このため、構造体などの大きな値型では、ByRef で渡す方が効率的です。
参照型では、データへのポインタだけがコピーされます (32 ビット プラットフォームでは 4 バイト、64 ビット プラットフォームでは 8 バイト)。したがって、パフォーマンスを損なうことなく、String 型や Object 型の引数を値で渡すことができます。
引数渡しの方法の決定
プロシージャの宣言では、各パラメータの引き渡し方法を指定します。宣言で ByVal が使用されている場合、呼び出し元のコードでそれを変更することはできません。しかし、ByRef を使って引数が宣言されている場合は、呼び出し元のコードで引数名をかっこで囲むことによって、ByVal で渡すように変更できます。
Visual Basic の既定の設定では、値渡しで引数が渡されます。ByVal キーワードを使うとコードが読みやすくなります。パラメータを宣言するときには、ByVal または ByRef のいずれかのキーワードを常に含めるようにすることをお勧めします。
引数を値で渡す場合
引数の基になる呼び出し元のコード要素が変更不可能である場合は、これに対応するパラメータは ByVal で宣言します。変更不可能な要素の値は、どのようなコードでも変更できません。
基になる要素が変更可能であっても、プロシージャからはその値を変更できないようにするには、パラメータを ByVal で宣言します。変更可能な要素が値渡しされた場合、その値を変更できるのは呼び出し元のコードだけです。
引数を参照で渡す場合
プロシージャが、呼び出し元のコード内にある基になる要素を変更する必要が本当にある場合、対応するパラメータを ByRef で宣言します。
プロシージャが正しく実行されるかどうかが、呼び出し元のコード内の基になる要素を変更するプロシージャに依存する場合、パラメータを ByRef で宣言します。これを値渡しした場合、または、呼び出し元のコードが引数をかっこで囲んで ByRef の引き渡し方法をオーバーライドした場合、プロシージャは予期しない結果になることがあります。