C#特性 迭代器(下) yield以及流的延迟计算

2019-12-26 11:17:15王冬梅

 

复制代码
static void Main()
        {
            WithYield();
            Console.ReadLine();
        }

 

测试2: 
测试WithNoYield()

 

复制代码
static void Main()
        {
            foreach (int i in WithNoYield())
            {
                Console.WriteLine(i.ToString());
            }
            Console.ReadLine();
        }

 

测试WithYield()

 

复制代码
static void Main()
        {
            foreach (int i in WithYield())
            {
                Console.WriteLine(i.ToString());
            }
            Console.ReadLine();
        }

 

给你5分钟时间给出答案,不要上机运行

*********************************5分钟后***************************************

测试1的运算结果
测试WithNoYield():输出从0-19的数字
测试WithYield():什么都不输出
测试2的运算结果
测试WithNoYield():输出1-19接着输出3-19
测试WithYield():输出12334455…….
(为节省空间上面的答案没有原样粘贴,可以自己运行测试)

 

是不是感到很奇怪,为什么使用了yield的程序表现的如此怪异呢?

测试1中对WithYield()的测试,明明方法调用了,居然一行输出都没有,难道for循环根本没有执行?通过断点调试果然如此,for循环根本没有进去,这是咋回事?测试2中对WithYield()的测试输出是有了,不过输出怎么这么有趣?穿插着输出,在foreach遍历WithYield()的结果的时候,好像不等到最后一条遍历完,WithYield()不退出,这又是怎么回事?