问题:return与yield return使用区别
解答:
1、使用如下代码,获取到所有偶数,添加到result的项后,才ruturn。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace YieldReturnDemo
{
class Program
{
static void Main(string[] args)
{
// 演示yield return
new YieldReturn();
YieldReturn.TestMethod();
Console.ReadLine();
}
}
public class YieldReturn
{
//私有静态字段 int类型数组
// 静态字段 可以不实例化就可以访问 类名.静态字段
private static List<int> _numArray;
//构造函数 初始化私有静态字段
public YieldReturn()
{
_numArray = new List<int>();
for(int i = 0; i < 100; i++)
{
_numArray.Add(i);
}
}
/// <summary>
/// 传统方式 获取的偶数先在循坏里面全部得到
/// 静态方法 不用实例化都可以访问
/// </summary>
/// <returns></returns>
public static IEnumerable<int> GetAllEvenNum()
{
List<int> result = new List<int>();
foreach(int num in _numArray)
{
if(num % 2 == 0)
{
result.Add(num);
}
}
return result;
}
/// <summary>
/// 使用yield return拿到全部偶数
/// 静态方法 不用实例化都可以访问
/// </summary>
/// <returns></returns>
public static IEnumerable<int> GetAllEvenNum2()
{
foreach(int num in _numArray)
{
if(num % 2 == 0)
{
yield return num;
}
}
yield break;
}
public static void TestMethod()
{
foreach(var item in GetAllEvenNum())
//foreach(var item in GetAllEvenNum2())
{
Console.WriteLine(item.ToString());
}
}
}
}
2、使用GetAllEvenNum2()函数,调试发现,每找到一个偶数就yield return,退出当前函数,并且会保存当前函数执行到什么地方,也就上下文。然后执行控制台打印,下一次再执行函数时,继续上次返回的末尾开始执行。
public static void TestMethod()
{
//foreach(var item in GetAllEvenNum())
foreach(var item in GetAllEvenNum2())
{
Console.WriteLine(item.ToString());
}
}
3、使用return的话,如果数据项很多,那么会有大的时间延迟,UI交互不好。使用yield return每找到一个就打印一个,不用考虑时间延迟的事。