.net - VB.NET 中的产量

标签 .net vb.net

C# 有一个名为 yield 的关键字。 VB.NET 缺少此关键字。 Visual Basic 程序员如何解决缺少此关键字的问题?他们实现自己的迭代器类吗?或者他们是否尝试编写代码以避免迭代器的需要?

yield关键字确实会强制编译器在幕后进行一些编码。 The implementation of iterators in C# and its consequences (part 1) 有一个很好的例子。

最佳答案

注意:这个答案现在已经过时了。此后,迭代器 block 已添加到 VB.NET

C# 在编译时将yield 关键字翻译成状态机。 VB.NET 没有yield 关键字,但它确实有自己的机制,可以在函数中安全地嵌入状态,而这在 C# 中不容易实现。

C# static关键字通常使用 Shared 转换为 Visual Basic关键字,但有两个地方会让人感到困惑。其一是 C# 静态类实际上是 Visual Basic 中的模块,而不是共享类(您可能会认为他们会让您在 Visual Basic 中以任何一种方式对其进行编码,但事实并非如此)。另一个是VB.NET确实有自己的Static关键词。然而,Static在 VB.NET 中具有不同的含义。

您使用Static VB.NET 中的关键字在函数内声明变量,并且当您这样做时,变量在函数调用之间保留其状态。这与在 C# 中声明私有(private)静态类成员不同,因为 VB.NET 中的静态函数成员也保证是线程安全的,因为编译器会在编译时将其转换为使用 Monitor 类。

那么为什么要把这些写在这里呢?好吧,应该可以构建一个可重复使用的通用 Iterator<T>类(或 VB.NET 中的 Iterator(Of T))。在此类中,您将使用 Yield() 实现 C# 使用的状态机。和Break()与 C# 关键字对应的方法。然后,您可以在函数中使用静态实例(在 VB.NET 意义上),以便它最终可以完成与 C# 的 yield 几乎相同的工作。大约相同数量的代码(放弃类实现本身,因为它可以无限地重用)。

我对 Yield 的关心程度还不够,无法亲自尝试,但它应该是可行的。也就是说,这也绝非微不足道,C# 团队成员 Eric Lippert 称之为“the most complicated transformation in the compiler”。

自从一年多前我写了这个初稿以来,我也开始相信,在 Visual Studio 2010 发布之前,这实际上不可能以有意义的方式实现,因为它需要向 Iterator 类发送多个 lambda 表达式,所以为了真正实用,我们需要 .NET 4对多行 lambda 的支持。

关于.net - VB.NET 中的产量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/97381/

相关文章:

.net - Log4net html 格式的 SmtpAppender

.net - Oracle.ManagedDataAccess 到 AWS RDS 数据库 - TCPS : Invalid SSL Wallet (Magic)

c# - 在 ASP.NET 网站中正确使用文件设计器文件

c# - 将 C# 桌面应用程序与 Rails 网络应用程序链接起来

sql - 从VB.net调用存储过程超时错误

MySql 异常未处理 - 命令执行期间遇到 fatal error

c# - 如何在 C# 中生成 UUID

c# - 资源友好的 StringReader 或 Memory Stream?

asp.net-mvc - 使用 asp.net mvc 的离线和在线应用程序

vb.net - 无限的 For 循环