VB.NETで構造体の配列を使用しています。配列の各要素のメンバを初期化するコードを書いていたら、For文を使用してループを回した時と、For Each文を使用してループを回した時では結果が変わることに気づきました。「あれ?ループ方法の違いだけで同じ処理を行っているはずなのに何で??」と思ったのでここに記します。
構造体の定義
Public Structure TestStructure
Dim member As ArrayList
Public Sub Initialize()
member = New ArrayList()
For i As Integer = 0 To 2
member.Add("hoge")
Next
End Sub
End Structure
構造体の中身はこんな感じです。
(1) For文でループさせる場合
Private testArrayA(4) As TestStructure
Private Sub forButton_Click(sender As System.Object, e As System.EventArgs) Handles forButton.Click
For i As Integer = 0 To testArrayA.Length - 1
testArrayA(i).Initialize()
Next
checkData(testArrayA)
End Sub
For文で構造体のメンバを一つずつ初期化するループはこうです。
(2) For Each文でループさせる場合
Private testArrayB(4) As TestStructure
Private Sub forNextButton_Click(sender As System.Object, e As System.EventArgs) Handles forNextButton.Click
For Each test As TestStructure In testArrayB
test.Initialize()
Next
checkData(testArrayB)
End Sub
For Each文で構造体のメンバを一つずつ初期化するループはこうです。
構造体に入った値の確認用関数
Private Sub checkData(target As TestStructure())
For Each test As TestStructure In target
With test
System.Diagnostics.Debug.WriteLine("member(0):{0} member(1):{1} member(2):{2}", .member(0), .member(1), .member(2))
End With
Next
End Sub
単純に構造体を一つ一つ取り出してメンバの値を出力するだけです。
では、このcheckData関数を使用して、(1)For文 と(2)For Each文の結果を確認してみるとどうなるでしょう?
(1) For 文の結果
(2) For Each 文の結果
あれ?(1)と違ってNullReferenceExceptionが発生してしまいました。
同じ処理を行ってるはずなのに何で!?!?
とりあえずFor Eachでは初期化がうまくいかないのでFor文に変更してプログラムは実装できたのですが、なぜこうなるのか分からないので気持ち悪いです。
誰か原因が分かる人、教えてください。
ソースが欲しい方はこちらからダウンロードできます