【医疗软件】【C#基础】yieId return和return的区别

写点东西:

       来上海工作四年多了,从学校里面的MFC、VxWorks、WindML,到工作用的Qt、C++、DuiLib、Windows生物识别驱动、有点含量的HCK和HLK测试,再到嵌入式开发板、乐鑫的esp8266、 Wifi联网锁的开发、物联网平台,小程序开发等等,感觉学了不少,又感觉啥都没有学到,出于职业规划考虑决定需要在一方面或者某个行业精益求精,而不能考虑广度优先的原则了,于是跳了槽来了国内最大的的某医疗公司开始了医疗软件开发相关工作。后面都会记录自己学习的点滴,勉励自己变得更加优秀。

由感而发,耽误各位看官的时间了,哈哈。

Return作用:这个关键字想必大家都用过,它主要有两个作用

[1]. 可以返回任意类型的数据

[2]. 遇到return语句,使得方法被返回,return后面的语句不再被执行,如下代码所示,i=1不会被执行到,函数返回0。

int testReturn()
{
    int i = 0;
    return i;
    i = 1;
}

for循环中return,也会直接使函数被返回,如果使for循环结束,继续执行for循环后面的代码,可以使用break结束for循环,或者使for条件为空也可以。

int testReturn()
{
    int n = 10;
    for(int i = 0; i < 5; ++i)
    {
        n = i;
        break;
    }
    return n;
}

yieId return的作用:

这个语法在学习C#和WPF时也是才接触到,对于一个示例程序中有这个玩意儿,很是不能理解,看的示例程序如下:

public static IEnumerable GetTestData() 
{
    var rand = new Random(DateTime.Now.Millisecond);
    for (int i = 0; i < 50; i++)
    {
        yield return new TestData
        {
            AddDateTime = DateTime.Now,
            StringValue = "字符串" + i.ToString(),
            IntValue = rand.Next(1000,9999),
            BoolValue = (rand.Next(0,10) > 5),
        };
    }
}

刚开始看这段代码,习惯用Cpp的思维和return作用来看这个函数,其实不然,主要还是不理解yieId return的语法,起作用有二:

[1]. 它只能返回IEnumerable类型,返回可以枚举的一个对象。yieId return后面的表达式为T类型,如果枚举没有元素,也会返回一个枚举数量Count=0的IEnumerable的结果,所以返回不会为空。

[2]. yieId return不会将函数返回,他会继续执行yieId return后面的语句,可以理解为在return的时候,保存了当前函数的状态,下次调用时继续从上次记录的位置开始执行。

上代码看看:

using System;
using System.Collections.Generic;

namespace Test_yieidReturn
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var item in GetListItems()) 
            {
                Console.WriteLine("Mian函数打印. item = " + item);
            }
        }

        static IEnumerable GetListItems()
        {
            Console.WriteLine("进入GetListItems函数...");
            List list = new List();
            for (int i = 0; i < 5; i++) 
            {
                list.Add(i);
            }
            Console.WriteLine("list对象数据加载完成...\n");

            // 每次 yield return 返回一个list的数据
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine("获取list数据...");
                yield return list[i];
            }
            Console.WriteLine("\n数据获取完成.");
        }

    }
}

执行结果:

【医疗软件】【C#基础】yieId return和return的区别_第1张图片

仔细看下,Main函数中的打印信息好像是在for循环语句中被执行了一样,这就是奇妙之处。

所以大家跟我一样就比较好奇了这样做的目的是为什么?  我理解为:“按需索取”

我们看代码中每次生成一个数据就被返回到Main中被处理了,在单线程的程序中,我们在线程中是不是只要申请一份内存空间就可以处理list中的数据了,而不需要申请多个内存来存储后在处理(当然这里的处理不是对所有数据进行类似排序这种处理)。在多线程的程序中,我们主程序或主线程可以进行数据处理,被调用函数(子线程)可以继续处理其他数据, 或者都放到子线程中操作,总之会加快程序的处理速度吧。 

如有误导或者错误之处,请批评指正,非常感谢!

 

 

你可能感兴趣的:(C#,&,WPF)