VB11(VB2012)新语法——迭代器关键字Iterator、Yield

长期以来使用VB的人都羡慕使用C#的人,能用上yield return关键字,实现下面集合操作的便捷写法

public int[] items;

public IEnumerable BuildCollection()
{
    for (int i = 0; i < items.Length; i++)
    {
        yield return items[i];
    }
}

在以前的VB版本中如果要使用迭代器需要参考一文中的别扭写法

Dim lines = New GenericIterator(Of String) _
   (Function(ByRef nextItem As String) As Boolean
      nextItem = rdr.ReadLine
      Return nextItem IsNot Nothing
   End Function)

但是到了现在VB11已经提供了Iterator、Yield关键字一起变得美好起来,这两个关键字的具体用法

    Private Iterator Function SomeNumbers() As IEnumerable
        ' Use multiple yield statements.
        Yield 3
        Yield 5
        Yield 8
    End Function

    Sub Main()
        For Each number As Integer In SomeNumbers()
            Console.Write(number & " ")
        Next
        ' Output: 3 5 8
        Console.ReadKey()
    End Sub

这样本文第一个C#的代码段就可以直接改写成

    Public items() As Integer
    Public Iterator Function BuildCollection() As IEnumerable
        For i = 0 To items.Length - 1
            Yield items(i)
        Next
    End Function

这样一来VB的迭代器的书写难度和性能就和C#毫无区别了

另外,算神还发现VB的迭代器还支持匿名函数的写法

    Sub TestIterator()
        Dim a = Iterator Function()
                    For i = 1 To 10
                        If i Mod 3 = 0 Then
                            Yield i
                        End If
                    Next
                End Function
        For Each j In a()
            Console.WriteLine(j)
        Next
    End Sub

与之对应的C#5还不支持,VB这次又超前于C#了

相对可惜的是VB11只支持Win7以上系统,对于还在使用XP开发的朋友是一道门槛

不过算神在这告诉一个好消息,这两个新关键字已经装载在Visual Studio Async CTP (SP1 Refresh)中,正在使用VS2010的朋友可以通过安装此包来获取体验到这个新语法

不允许评论