C#yield return和yield break函数执行逻辑理解

本文详细介绍了C#中yield return和yield break的使用要求及执行逻辑。yield return用于指定返回类型并保留堆栈信息,允许在异步循环中暂停和恢复执行,常用于Unity的协程。yield break则可在遍历过程中提前结束,限制返回值范围。当yield迭代器执行完毕,不会保留堆栈信息。同时,yield语句会根据迭代器生成枚举属性和方法,与foreach语句一起工作,提供枚举访问。
摘要由CSDN通过智能技术生成

1.使用要求:

 1)你不能在具有以下特点的方法中包含 yield return 或 yield break 语句:
    匿名方法。 有关详细信息,请参阅匿名方法(C# 编程指南)。

    包含不安全的块的方法。 有关详细信息,请参阅unsafe(C# 参考)。

2)返回类型要求:
迭代器的声明必须满足以下要求:
    返回类型必须为 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。
    该声明不能有任何 ref 或out https://msdn.microsoft.com/zh-cn/library/t3c3bfhx.aspx 参数。
    返回 IEnumerable 或 IEnumerator 的迭代器的 yield 类型为 object。
    如果迭代器返回 IEnumerable<T> 或 IEnumerator<T>,则必须将 yield return 语句中的表达式类型隐式转换为泛型类型参数。

3)异常处理:
不能将 yield return 语句置于 try-catch 块中。 可将 yield return 语句置于 try-finally 语句的 try 块中。
yield break 语句可以位于 try 块或 catch 块,但不能位于 finally 块。
如果 foreach 主体(在迭代器方法之外)引发异常,则将执行迭代器方法中的 finally 块。
 

2.yield return 要求指定返回类型和查询完交出控制权保留堆栈信息

1.返回类型,查询内部,用于查询返回一个,不是一次函数执行到底提高了线性遍历性能
// 返回Oject没有什么作用
//Object enum_Num = Power(2, 8);
//Console.Write("{0} ", enum_Num);

// 返回IEnumerable<T>默认给创建一个迭代器容器,返回时候要隐式转换为泛型具体类型,且外部遍历也要foreach驱动,因为里面只取一个返回。

3.yield break 会不等整个查询元素遍历完而返回,可以限定返回值区间

4.直接调用yield封装的函数不会被执行,只是创建一个迭代器集合,会延迟到使用时候计算

MSDN中解释:
调用 MyIteratorMethod 并不执行该方法的主体。 相反,该调用会将 IEnumerable<string> 返回到 elements 变量中。

在 foreach 循环迭代时,将为 elements 调用 MoveNext 方法。 此调用将执行 MyIteratorMethod 的主体,直至到达下一个 yield return 语句。 yield return 语句返回的表达式不仅决定了循环体使用的 element 变量值,还决定了元素的 Current 属性(它是 IEnumerable<string>)。

在 foreach 循环的每个后续迭代中,迭代器主体的执行将从它暂停的位置继续,直至到达 yield return 语句后才会停止。 在到达迭代器方法的结尾或 yield break 语句时ÿ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值