0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【解決済】全く同じ処理のはずだが、For 文では動作するのにFor Each文では何故か動作しない

Last updated at Posted at 2016-06-26

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 文の結果

ForForEach160626_01.png
ちゃんと構造体の初期化ができているのが分かります。

(2) For Each 文の結果

ForForEach160626_02.PNG
あれ?(1)と違ってNullReferenceExceptionが発生してしまいました。
同じ処理を行ってるはずなのに何で!?!?

とりあえずFor Eachでは初期化がうまくいかないのでFor文に変更してプログラムは実装できたのですが、なぜこうなるのか分からないので気持ち悪いです。
誰か原因が分かる人、教えてください。

ソースが欲しい方はこちらからダウンロードできます

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?