VB.NETの関数の戻り値が参照型について
VB.NETの関数内で、あるクラスなどを「New」で実体(インスタンス)を生成し その参照値を戻り値として返すことができます。
この使い方ですが、VB.NETを使い始めた時にすぐには理解できませんでした。
この関数を何回もコールしてもOKなのか?
「New」で生成されたクラスの実体は使わなくなった時にどうなるのか?
夜も眠れない(大げさですが)感じでした。
それでは、以下のソースを例に説明します。
これを実行させると以下の様な表示になります。
==============
Lst1(0) = 0
Lst1(1) = 0
Lst2(0) = 1
Lst2(1) = 1
Lst2(2) = 1
==============
関数「GetArrList」はArrayListクラスを生成し、 指定された要素数までを初期値で設定しそのクラスの参照を返します。
「GetArrList」で生成されたArrayListの実体はVB.NETのヒープと呼ばれるメモリ領域に確保され その参照が、関数内の変数「List」に返されます。 この変数「List」を使って、ArrayListのメソッドを使用しデータ設定を行います。 その後、「List」の値そのものを「Return」命令で返してやります。
メイン側では、「GetArrList」から返される値を、ArrayList型の参照変数に代入します。
2回「GetArrList」をコールすることで別々のArrayList型のデータを生成できます。 1回目で「GetArrList」が「New」で確保されるメモリ領域と、2回目では別のメモリ領域になります。 「New」はその都度、新しいメモリ領域を確保し、その参照を返してきます。
この確保されたメモリ領域ですが、そのまま放置しておくとどうなるのでしょうか。
放置しておくとそのまま残った状態になります。
残ったままでは問題なので、メモリから消し去ることが必要です。 ヒープに確保されたメモリは、その参照が無くなった時点で、 システムが適当にクリアしてくれます。
一般にガベージコレクション(ゴミ集め)と言われています。
それでArrayList型の参照変数である「Lst1」を「Nothing」にしてやります。 参照を無くしてやることになります。
尚、今回の例では、「Main」関数がすぐに終わる形なっていますので 「Nothing」を設定しなくても「Main」関数が終了時点で使っていた メモリは全て廃棄されるはずですので、心配はいりませんが。
ただし、プログラムが複雑になってきて参照型変数を多く使う場合は その変数が必要なくなった時点で廃棄する必要があると思います。
■関連記事
⇒VB.NETの関数の参照型データの引数での値渡しと参照渡しの違いについて
⇒VB.NETの配列のReDimについて
⇒VB.NETの配列は参照型
⇒VB.NETの値型と参照型について
⇒VB.NETの文字列型(String)について
コメント