5

我正在将 C# 项目转换为 VB.net,并且需要了解 C# 的 Yield Break。我知道已经有关于 Stack Overflow 上的 Yield Break 的问题,但我觉得这些问题有点不同。

1.) 当您 Yield Break 时,包含它的函数是否向调用者返回一个值?如果是这样,它是 Null/Nothing,函数类型的默认值,还是其他什么?

2.) 当您 Yield Break 时,迭代器是否重新开始。换句话说,下次调用Iterator时,会不会再次返回集合中的第一项?

3.) 与 Yield Break 最接近的 vb.net 是什么?退出函数?什么都不退?还有什么?

4

3 回答 3

7
  1. 当您 Yield Break 时,包含它的函数是否会向调用者返回一个值?如果是这样,它是 Null/Nothing,函数类型的默认值,还是其他什么?

不,它不返回值。它只是结束枚举。您可以说,它将IEnumerator.MoveNext()返回值设置为false,仅此而已。

  1. 当您 Yield Break 时,迭代器是否会重新开始。换句话说,下次调用Iterator时,会不会再次返回集合中的第一项?

这完全取决于您的方法是如何编写的,但是当您调用使用yield您的方法时,您正在创建状态机的新实例,因此它可以再次返回相同的值。

  1. 与 Yield Break 最接近的 vb.net 是什么?退出函数?什么都不退?还有什么?

“您可以使用退出函数或返回语句来结束迭代。”

来自Yield Statement (Visual Basic)

于 2013-11-06T01:46:03.093 回答
5

yield break;不会产生一个项目作为IEnumerable<T>返回值的一部分。

例如,以下为您提供了一个空的枚举:

IEnumerable<int> F()
{
     yield break;
}

这意味着F().Count()为 0。

于 2013-11-06T01:44:16.027 回答
2

当您 Yield Break 时,包含它的函数是否会向调用者返回一个值?如果是这样,它是 Null/Nothing,函数类型的默认值,还是其他什么?

不,它停止了生成。不产生任何价值yield break;。如果您将迭代器视为带有回调的循环,那就像break跳出循环一样。

当您 Yield Break 时,迭代器是否会重新开始。换句话说,下次调用Iterator时,会不会再次返回集合中的第一项?

是的,它再次被调用,它产生了一个新的迭代器。

与 Yield Break 最接近的 vb.net 是什么?退出函数?什么都不退?还有什么?

Exit Function.

于 2013-11-06T01:45:45.117 回答