gpt4 book ai didi

.net - 将列表的枚举数传递给函数

转载 作者:行者123 更新时间:2023-12-04 17:56:24 25 4
gpt4 key购买 nike

看起来将列表的枚举数传递给函数“byval”与传递“byref”完全不同。本质上,常规的“byval”传递不会改变调用者的“enumerator.Current 值”,即使函数推进了枚举器。我想知道是否有人知道为什么会这样?枚举器是一个像整数一样的原语,没有对象引用,因此对它的更改不会反射(reflect)在调用者中吗?

这是示例代码:

这个函数是byval,并且陷入无限循环,吐出“1”消息框,因为枚举器的“当前”永远不会超过5:

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

这两个函数之间的区别仅在于 listFirstItem__ 函数是否接受 byval 或 byref 枚举器。

最佳答案

您看到这种行为的原因是 List(Of T).EnumeratorStruct而不是 Class正如普遍预期的那样。因此,当您传递枚举器时,您将传递它的一个副本,因此当您调用 MoveNext 时,只有该副本会被更新。

关于.net - 将列表的枚举数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8360077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com