编程VB.NET开发人员,后端开发人员

在Visual Basic中,For Each循环如何工作?与For和While有何区别,可以以这种方式遍历哪些对象,以及在循环中更改集合时会出现哪些陷阱?

用 Hintsage AI 助手通过面试

答复

在Visual Basic中,For Each循环用于顺序遍历集合或数组中的所有元素。它的使用简化了对可枚举对象(如CollectionArray、列表等)的操作,无需显式访问索引。

语法:

For Each element As DataType In collection ' 对element的操作 Next

与其他循环的区别:

  • For — 需要指定计数器和范围,适用于需要按索引访问元素的情况。
  • While — 当条件为真时执行,适用于不确定的迭代次数。
  • For Each — 无需访问索引遍历所有元素,适合现代集合。

For Each的限制和特点:

  • 不能直接更改集合中的元素(尤其是如果集合是不可变的或结构化的)。
  • 集合必须实现IEnumerable接口。
  • 在循环进行时(添加/删除元素)更改集合可能会引发InvalidOperationException异常。

示例:

Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next

尝试在循环中修改集合可能会引发错误:

For Each item As Integer In items If item = 2 Then items.Remove(item) ' 异常! End If Next

有陷阱的问题

如果元素是结构体,使用For Each是否可以按值修改集合中的元素?

不可以,如果集合的元素是结构体(值类型),则For Each中的迭代变量包含值的副本。对变量的任何修改不会影响集合中的实际元素。例如:

Structure Point Public X As Integer End Structure Dim points As New List(Of Point)({New Point With {.X = 1}}) For Each pt In points pt.X = 100 ' 不会改变points(0).X Next

由于对主题细微差别的不熟悉而导致的真实错误示例


故事

在项目中使用For Each来修改员工结构的字段。迭代并未更改原始数据,因为迭代对象是副本,而不是集合的实际元素。由于此原因,工资更新未能生效。


故事

在For Each中遍历列表时在条件内删除元素 — 结果应用程序抛出InvalidOperationException并意外终止。


故事

在未考虑集合的可变性情况下,通过For Each遍历集合导致无限循环,因为外部数据源在读取的同时填充该集合,导致计算中的逻辑错误。