VB.NETの関数の参照型データの引数での値渡しと参照渡しの違いについて
VB.NETの関数で参照型データ(オブジェクト型)を引数にする場合、値渡しと参照渡しで少し挙動が異なります。
先ず以下のソースを見て下さい。2個の ArrayList 変数を生成し、それぞれ値渡しと参照渡しの値設定関数をコールしています。 「SetArrList1」と「SetArrList2」がコールされる関数ですが、この二つの関数は内部の処理は全く同じ様な処理で 引数の宣言が「ByVal」か「ByRef」かの違いだけです。
「SetArrList1」と「SetArrList2」共に、ArrayListにデータを5個追加する処理をしていますが、 値渡しでも、参照渡しでも渡された引数のArrayListの中のデータが変わることがわかると思います。
「SetArrList1」と「SetArrList2」実行後のデータ表示でそれが分かります。
このソースの実行結果を見てみます。
結果からみて注意することは、参照型データを引数で渡す時には値渡しであっても、 その参照型のメソッドを使って参照型の中のデータは変更できるということです。
そこで、次に渡された引数に対して変更を行った場合にはどうなるのかを見てみます。
先ほどのソースに「SetArrList1New」「SetArrList2New」の関数を追加します。 それぞれは内部で、新規にArrayListを生成し、1件のデータを追加後、引数の変数に設定しています。 引数の宣言が「ByVal」か「ByRef」の違いがあるだけです。
結果から分かることは、「ByVal」の引数ではコール元のArrayListの変数「Lst1」は変化しないことです。 また、「ByRef」の引数の方は、「Lst2」の中身が変わってしまっています。 「Lst2」が参照するArrayListの場所が上書きされています。
「ByRef」の場合は、関数内で引数を書き換えてしまうと、最初に渡されてきたデータの参照が どこかに行ってしまい、宙ぶらりんでどこからも参照できなくなる可能性がありますので、注意が必要です。
■関連記事
⇒VB.NETの関数の戻り値が参照型について
⇒VB.NETの配列のReDimについて
⇒VB.NETの配列は参照型
⇒VB.NETの値型と参照型について
⇒VB.NETの文字列型(String)について
コメント