补充:yield关键字用法

使用yield return返回集合,不是一次性加载到内存中,而是客户端每调用一次就返回一个集合元素,是一种"按需供给"。

class Program
{
    static Random r = new Random();
    static IEnumerable<int> GetList(int count)
    {
        List<int> list = new List<int>();
        for (int i = 0; i < count; i++)
        {
            list.Add(r.Next(10));
        }
        return list;
    }
    static void Main(string[] args)
    {
        foreach(int item in GetList(5))
            Console.WriteLine(item);
        Console.ReadKey();
    }
}

使用yield return也能获得同样的结果。修改GetList方法为:

 static IEnumerable<int> GetList(int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return r.Next(10);
        }
    }

通过断点调试发现:客户端每显示一个集合中的元素,都会到GetList方法去获取集合元素。

至于为什么会出现这种情况,我们可以用ILSpy对生成的exe进行反编译来找到原因。
由于直接反编译成C#会变为原样
在.NET 1.0版本下查看GetList方法,发现该方法返回的是一个GetList类的实例。原来yield return是"语法糖",其本质是生成了一个GetList的实例。
在这里插入图片描述
在这里插入图片描述○ 原来GetList类实现了IEnumerable和IEnumerator的泛型、非泛型接口
○ yield return返回的集合之所以能被迭代、遍历,是因为GetList内部有迭代器
○ yield return之所以能实现"按需供给",是因为GetList内部有一个_state字段记录这上次的状态

参见:https://www.cnblogs.com/blueberryzzz/p/8678700.html

总结:
○ yield return能返回一个"按需供给"的集合
○ yield return是"语法糖",其背后是一个实现了IEnuerable,IEnumerator泛型、非泛型接口的类,该类维护着一个状态字段,以保证yield return产生的集合能"按需供给"
○ yield break配合yield return使用,当产生集合达到某种条件的时候使用yield break,以终止继续创建集合

yield关键字的作用是将当前集合中的元素立即返回,只要没有yield break,方法还是会继续执行循环到迭代结束。

1.返回元素用yield return;(一次一个的返回)

2.结束返回用yield break;(终止迭代)

3.返回类型必须为 IEnumerable、IEnumerable、IEnumerator 或 IEnumerator。

4.参数前不能使用ref和out关键字

5.匿名方法中 不能使用yield

6.unsef中不能使用

7.不能将 yield return 语句置于 try-catch 块中。 可将 yield return 语句置于 try-finally 语句的 try 块中。yield break 语句可以位于 try 块或 catch 块,但不能位于 finally 块

作者:Michael_Zyz
来源:CSDN
原文:https://blog.csdn.net/zyzbulus/article/details/82352056
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值