C# Yield

一.测试代码

关于Yield使用,先来直接上测试代码,看不同之处。

    static void Main(string[] args)
        {
            var test1 = GetResult();
            Console.WriteLine("未用yield");
            foreach (var i in test1)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("**********************************");
            Console.WriteLine("使用yieldReturen");
            var test2 = GetResultByYield();
            foreach (var i in test2)
            {
                Console.WriteLine(i);
            }


            Console.WriteLine("**********************************");
            Console.WriteLine("使用yieldBreak");
            var test3 = GetResultByYieldBreak();
            foreach (var i in test3)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();






        }




        public static IEnumerable<int> GetResult()
        {
            var strs = new List<int>();
            for (int i = 0; i < 10; i++)
            {
                strs.Add(i);
            }
            return strs;
        }


        public static IEnumerable<int> GetResultByYield()
        {
            for (int i = 0; i < 10; i++)
            {
                yield return i;
            }
        }




        public static IEnumerable<int> GetResultByYieldBreak()
        {
            for (int i = 0; i < 10; i++)
            {
                if (i < 8)
                {
                    yield return i;    
                }
                else
                {
                    yield break;
                }
                
            }
        }


二、测试结果

下面再来看执行结果。




三、官方帮助文档

官方帮助文档地址:https://msdn.microsoft.com/library/9k7k7cf0(v=vs.110).aspx

四、注意点

从代码中可以看到,未用Yield方法中,返回结果是返回的的一个List<int>,就是说,需要先声明泛型类来保存遍历出来 的结果。
GetResultByYield方法以及GetResultByYieldBreak都没有声明额外 的泛型类,而是直接以yield return来返回的结果,使用yield方法的好处是,执行方法会从上次执行的地方向下继续 执行,当所有结果执行完成后,再返回总的结果。
 yield break则是彻底中断执行,返回已经拿到部分或者是全部结果。

使用一个 yield return 语句返回每个元素一个节点。
使用 foreach 语句或 LINQ 查询,则使用迭代器方法。 foreach 循环的每次迭代调用迭代器方法。 当 yield return 语句在迭代器方法时为止,expression 返回,并且,代码的当前位置保留。 当下次调用迭代器函数时执行从该位置重新启动。
可以使用 yield break 语句结束迭代。
yield return 语句不能位于 try-catch 块。 yield return 语句可以位于在尝试 try-finally 块语句。
yield break 语句可以位于 try 块或 catch 块,但不能位于 finally 块。
如果 foreach 主体 (在迭代器方法的外部) 引发异常,finally 在迭代器方法执行块。

五、互助交流

欢迎加入.net技术交流群 .Net技术交流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值