编程VB.NET 开发人员

如何在 Visual Basic 中实现 For 和 For Each 循环?在什么情况下选择这两种循环?在处理集合时常见的错误有哪些?

用 Hintsage AI 助手通过面试

回答。

在 Visual Basic 中有 For 和 For Each 循环,每种循环适用于特定任务。

问题历史

VB6 和经典 Visual Basic 只支持范围循环(For ... Next)。在后来的版本中(从 VB6 和 VB.NET 开始),出现了 For Each,可以优雅地遍历集合和数组的元素。

问题

主要问题是错误选择循环类型并尝试在 For Each 中修改集合,这会导致运行时错误。

解决方案

当需要:

  • 元素的索引时,使用普通的 For
  • 按索引修改数组元素时,使用普通的 For
  • 遍历数字范围时,使用普通的 For

当需要:

  • 仅关心每个元素的值时,使用 For Each
  • 收集结构事先未知时,使用 For Each
  • 美观和减少错误时,使用 For Each

代码示例:

' 带修改的元素遍历 Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' 仅读取集合 Dim list As New List(Of String) From {"one", "two", "three"} For Each s As String In list Console.WriteLine(s) Next

关键特点:

  • For 用于处理索引
  • 在循环中无法修改集合的内容
  • For Each 对任何 IEnumerable 对象都通用

带陷阱的问题。

可以在 For Each 中修改 List(Of T) 吗?

不可以。这会导致 InvalidOperationException,因为在迭代过程中集合的结构不应改变。

如何提前退出 For Each 循环?

当找到所需元素时,使用 Exit For 语句。

For Each s In list If s = "two" Then Exit For End If Next

For 和 For Each 在数组上的速度差异是什么?

通常差别很小,但 For 可能会稍快一些(尤其是对于原始类型数组),因为它直接与索引一起工作,而 For Each 创建了额外的枚举器对象。

常见错误和反模式

  • 在 For Each 中修改集合
  • 使用普通的 For 时混淆数组和集合的索引
  • 如果需要元素的索引,却使用 For Each

生活中的例子

负面案例

开发人员尝试在 For Each 中从 List(Of T) 中删除元素。运行时收到 InvalidOperationException 错误。

优点:

  • 简单的集合读取代码

缺点:

  • 程序崩溃

积极案例

为删除元素,从后向前遍历,使用普通的 For:

For i = list.Count - 1 To 0 Step -1 If list(i) = "two" Then list.RemoveAt(i) End If Next

优点:

  • 没有迭代错误,所有需要的元素都被删除

缺点:

  • 需要更多代码并理解数据结构