【问题标题】:Does Yield Break return a value?Yield Break 是否返回值?
【发布时间】:2013-11-17 02:57:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • yield break 本质上通知迭代器没有更多的值。如果它是方法中命中的第一个项目,它将 like 返回一个空列表。方法本身仍然返回IEnumerable,但如果你尝试迭代它,它就像迭代一个空列表(也就是说,不会发生迭代)。如果您尝试重新迭代相同的IEnumerable 结果,它将再次调用该方法。根据您的逻辑,这可能意味着它会以相同的方式命中yield break(因此就像一个空列表),或者这次您可能会让它产生值。无法对 VB 发表评论。
  • 我猜是Exit Function; MSDN suggests Exit Function and Return both work。 (参见技术实现

标签: c# vb.net break yield


【解决方案1】:
  1. 当您使用 Yield Break 时,包含它的函数是否会向调用者返回一个值?如果是这样,它是 Null/Nothing,它的默认值 函数的类型,还是其他?

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

  1. 当您退出时,迭代器是否会重新开始。换句话说,下次调用 Iterator 时,它是否会返回第一个元素? 再次收藏?

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

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

“您可以使用 Exit Function 或 Return 语句来结束迭代。”

来自Yield Statement (Visual Basic)

【讨论】:

    【解决方案2】:

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

    例如,下面给你一个空的枚举:

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

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

    【讨论】:

    • 虽然 Marcin 的回答更完整,但我想给您一点意见,因为您最清楚地回答了返回类型问题。
    【解决方案3】:

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

    不,它会停止生成。 yield break; 不产生任何值。如果你把迭代器想象成一个带有回调的循环,那就像break跳出循环一样。

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

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

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

    Exit Function.

    【讨论】:

    • 'Return' 也有效 - 迭代器是唯一可以在函数中使用简单 'Return' 的地方,这意味着迭代器已经结束。
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 2012-05-20
    • 2012-02-22
    • 1970-01-01
    • 2018-08-26
    • 2016-08-03
    • 2011-03-26
    • 2020-12-19
    相关资源
    最近更新 更多