C#有一个名为yield的关键字.VB.NET缺少这个关键字.Visual Basic程序员如何解决缺少此关键字的问题?他们是否实现了自己的迭代器类?或者他们尝试编码以避免需要迭代器?
该产量关键字不强制编译器做幕后的一些编码.在C#中实现迭代器及其后果(第1部分)就是一个很好的例子.
C#在编译时将yield关键字转换为状态机.VB.NET没有yield关键字,但它确实有自己的机制,可以在C#中不容易获得的函数中安全地嵌入状态.
C#static
关键字通常使用Shared
关键字转换为Visual Basic ,但有两个地方让事情变得混乱.一个是C#静态类实际上是Visual Basic中的模块而不是Shared类(您认为它们允许您在Visual Basic中以任何方式编写代码,但是noooo).另一个是VB.NET确实有自己的Static
关键字.但是,Static
在VB.NET中有不同的含义.
您可以Static
在VB.NET中使用关键字在函数内声明变量,当您执行变量时,它会在函数调用中保留其状态.这与在C#中声明私有静态类成员不同,因为VB.NET中的静态函数成员也保证是线程安全的,因为编译器将其转换为在编译时使用Monitor类.
那么为什么要写这一切呢?那么,应该可以构建一个可重用的泛型Iterator
类(或Iterator(Of T)
在VB.NET中).在这个类中,您将实现C#使用的状态机,以及Yield()
与Break()
C#关键字对应的方法.然后你可以在一个函数中使用一个静态实例(在VB.NET意义上),这样它最终可以yield
在大约相同数量的代码中完成与C#相同的工作(丢弃类实现本身,因为它将是无限的可重复使用的).
关于Yield我不太关心自己尝试它,但它应该是可行的.也就是说,它也远非微不足道,因为C#团队成员Eric Lippert称这是" 编译器中最复杂的转换 ".
自从我在一年前编写第一稿之后,我也开始相信,在Visual Studio 2010问世之前,它不可能以一种有意义的方式实现,因为它需要将多个lambdas发送到Iterator类,所以要真的实际上我们需要.NET 4支持多行lambdas.
该异步CTP包括用于支持Yield
在VB.NET.
有关用法的信息,请参阅Visual Basic中的迭代器.
现在它已包含在Visual Studio 2012的包装盒中!
在Visual Studio杂志中的Bill McCarthy 在VB.NET中进行模拟时,有很好的文章使用VB中的Iteratorsyield
.或者等待下一版本的Visual Basic.