gpt4 book ai didi

.net - VB.NET 中的产量

转载 作者:行者123 更新时间:2023-12-03 05:38:54 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com