おすすめ本

最近のトラックバック

  • event (夢茶爺&苦茶爺のPC奮戦備忘録)

AccRanking

Ad

« リモートデスクトップでローカルPCのドライブをアクセスしたい場合 | メイン | BCPコマンドでUnicode文字形式を使用したデータのインポート及びエクスポート(SQL Server)について »

2016年2月17日 (水)

VB.NETの関数の参照型データの引数での値渡しと参照渡しの違いについて

VB.NETの関数で参照型データ(オブジェクト型)を引数にする場合、値渡しと参照渡しで少し挙動が異なります。
先ず以下のソースを見て下さい。2個の ArrayList 変数を生成し、それぞれ値渡しと参照渡しの値設定関数をコールしています。 「SetArrList1」と「SetArrList2」がコールされる関数ですが、この二つの関数は内部の処理は全く同じ様な処理で 引数の宣言が「ByVal」か「ByRef」かの違いだけです。
「SetArrList1」と「SetArrList2」共に、ArrayListにデータを5個追加する処理をしていますが、 値渡しでも、参照渡しでも渡された引数のArrayListの中のデータが変わることがわかると思います。
「SetArrList1」と「SetArrList2」実行後のデータ表示でそれが分かります。

このソースの実行結果を見てみます。

Rst1


結果からみて注意することは、参照型データを引数で渡す時には値渡しであっても、 その参照型のメソッドを使って参照型の中のデータは変更できるということです。

そこで、次に渡された引数に対して変更を行った場合にはどうなるのかを見てみます。
先ほどのソースに「SetArrList1New」「SetArrList2New」の関数を追加します。 それぞれは内部で、新規にArrayListを生成し、1件のデータを追加後、引数の変数に設定しています。 引数の宣言が「ByVal」か「ByRef」の違いがあるだけです。

Rst2_2


結果から分かることは、「ByVal」の引数ではコール元のArrayListの変数「Lst1」は変化しないことです。 また、「ByRef」の引数の方は、「Lst2」の中身が変わってしまっています。 「Lst2」が参照するArrayListの場所が上書きされています。

「ByRef」の場合は、関数内で引数を書き換えてしまうと、最初に渡されてきたデータの参照が どこかに行ってしまい、宙ぶらりんでどこからも参照できなくなる可能性がありますので、注意が必要です。

■関連記事
VB.NETの関数の戻り値が参照型について
VB.NETの配列のReDimについて
VB.NETの配列は参照型
VB.NETの値型と参照型について
VB.NETの文字列型(String)について


楽天市場

トラックバック

このページのトラックバックURL:
http://app.mitelog.jp/t/trackback/459161/33743881

VB.NETの関数の参照型データの引数での値渡しと参照渡しの違いについてを参照しているブログ:

コメント

コメントを投稿