忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:配列は参照型?について
「VB.NETの値型と参照型について」の記事で「参照型」には「配列」があると触れましたが、 今回はそのことを詳しく見ていきます。

まずは配列の宣言方法ですが、以下の様に定義できます。

 Dim 配列名(指標上限値) As 各要素のデータ型

配列宣言の例としては以下の様になります。
3,4行目の配列の初期化を含む宣言の場合、「指標上限値」は省略する必要があります。
Dim intArr(4) As Integer
Dim lngArr(5) As Long, dblArr(10) As Double, strArr(20) As String
Dim nArr() As Integer = {1, 2, 3, 4, 5}		'{}で括り初期値リストを記述(Integer型)
Dim sArr() As String = {"AAA", "BBB", "CC"}	'{}で括り初期値リストを記述(String型)

通常配列を扱う場合は、配列の添え字を指定して各要素のデータにアクセスします。 例えば以下の様な感じです。
'配列宣言
Dim intArr(4) As Integer
'各要素に適当な値を入れる
intArr(0) = 1
intArr(3) = 2
'指標=3の要素を表示する
Console.WriteLine(String.Format("intArr(3) = {0}", intArr(3)))

'intArrの要素を各指標値に設定する
For i As Integer = LBound(intArr) To UBound(intArr)
    intArr(i) = i
Next

「LBound」「UBound」は配列の指標の最小値及び最大値を返す関数です。 配列の全てを処理する場合、この関数を使うほうがバグが出にくいと思います。

そこで参照型であることを説明するために以下のソースを見てください。
'配列宣言(指標MAX指定)
Dim intArr(4) As Integer
'intArrの要素を各指標値に設定する
For i As Integer = LBound(intArr) To UBound(intArr)
    intArr(i) = i
Next

'配列宣言(指標指定無し)
Dim intArr2() As Integer    '配列の参照の枠のみ
intArr2 = intArr            '配列の参照コピー
For i As Integer = LBound(intArr2) To UBound(intArr2)
    Console.WriteLine(String.Format("intArr2(" & i & ") = {0}", intArr2(i)))
    Console.WriteLine(String.Format("intArr (" & i & ") = {0}", intArr(i)))
Next

このソースで表示される結果からわかるように、 「intArr2」と「intArr」が示すデータは全く同じものになります。 「intArr2」に「intArr」をコピーしているので当然なのですが、 「intArr」の配列の実体は5個のInteger型のデータの並びなのですが、 それを参照しているものが「intArr」の変数の中身なのです。 図で示すと以下の様な感じです。

更に以下のソースを見てください。 「intArr」を宣言後、要素にデータを設定し、その後で「intArr」に「Nothing」を入れています。
'配列宣言(指標MAX指定)
Dim intArr(4) As Integer
'intArrの要素を各指標値に設定する
For i As Integer = LBound(intArr) To UBound(intArr)
    intArr(i) = i
Next
'参照をクリアする
intArr = Nothing
'エラーが発生する部分
Console.WriteLine(String.Format("intArr(0) = {0}", intArr(0)))

これを実行すると最後のコンソール出力の行でエラーが発生します。 「intArr」が指し示していた内容がクリアされたため、 最初に宣言したときの配列の実体への参照が出来なくなっているからです。

このことから、配列の変数も、クラス変数と同様な感じが分かると思います。


=====
2016/01/30:の時の情報











PR

コメント

コメントを書く