您的位置:首页 > 编程语言 > C#

C# Yield

2016-01-15 09:58 639 查看

一.测试代码

关于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技术交流群

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: