質問

リストの列挙器を「byval」関数に渡すことは、「byref」を渡すこととはまったく異なるようです。基本的に、通常の「byval」パスは、関数が列挙器を進歩させても、発信者の「列挙型」を変更しません。なぜこれが事実なのか誰かが知っているのだろうかと思っていましたか?列挙器は、オブジェクトの参照なしで整数のような原始であるため、発信者には反映されませんか?

これがサンプルコードです:

この関数はバイバルであり、列挙者の「現在」が5を超えないため、「1」のメッセージボックスを吐き出す無限のループに閉じ込められます。

Public Sub listItemsUsingByValFunction()
    Dim list As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})

    Dim enumerator = list.GetEnumerator()
    enumerator.MoveNext()
    While enumerator.Current <= 5
        listFirstItemByVal(enumerator)
    End While
End Sub
Private Sub listFirstItemByVal(ByVal enumerator As List(Of Integer).Enumerator)
    MsgBox(enumerator.Current)
    enumerator.MoveNext()
End Sub

一方、これは、予想されるように機能します。

Public Sub listItemsUsingByRefFunction()
    Dim list As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})

    Dim enumerator = list.GetEnumerator()
    enumerator.MoveNext()
    While enumerator.Current <= 5
        listFirstItemByRef(enumerator)
    End While
End Sub
Private Sub listFirstItemByRef(ByRef enumerator As List(Of Integer).Enumerator)
    MsgBox(enumerator.Current)
    enumerator.MoveNext()
End Sub

2つの関数の違いは、listFirstitem__関数がバイバルまたはBYREF列挙器を受け入れるかどうかのみです。

役に立ちましたか?

解決

あなたがこの動作を見ている理由はそれです List(Of T).Enumerator aです Struct そして、ではありません Class 一般的に予想されているように。したがって、列挙者を渡すと、そのコピーを渡すと、そのコピーのみが電話をかけると更新されます MoveNext

他のヒント

提供されたサンプルコードを使用しても、オプションStrictを使用してコンパイルされません。あなたが見る違いを修正するかもしれない修正。

Public Sub listItemsUsingByValFunction()
    Dim list As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})

    Dim enumerator As IEnumerator(Of Integer) = list.GetEnumerator()
    enumerator.MoveNext()
    Debug.WriteLine("S " & enumerator.Current)
    Stop
    Do
        Debug.WriteLine("W " & enumerator.Current)
        If Not listFirstItemByVal(enumerator) Then Exit Do
    Loop
End Sub

Private Function listFirstItemByVal(ByVal enumerator As IEnumerator(Of Integer)) As Boolean
    Debug.WriteLine("F " & enumerator.Current)
    Return enumerator.MoveNext()
End Function

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    listItemsUsingByValFunction()
End Sub
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top