**
yield return作用 – 在 return 时,保存当前函数的状态,下次调用时继续从当前位置处理。
**
优点:在处理循环时可以每生成一个数据就返回一个数据让主函数进行处理。在单线程的程序中,由于不需要等所有数据都处理好再返回,所以可以减少对内存占用。
比如说有多个数据,如果一次性处理好返回,需要先开辟大量内存,而一个个返回,只需要占用1个内存单位。在多线程的处理程序中,还可以加快程序的处理速度。
一个经典的应用是Socket,主线程处理对Socket接收到的数据进行处理,而另外一个线程负责读取Socket的内容。当接收的数据量比较大时,两个线程可以加快处理速度。
演示:
class Program
{
static void Main(string[] args)
{
foreach (var item in GetNumbers())
Console.WriteLine("主线程: 子线程数据 = " + item);
Console.WriteLine("--------------------");
foreach (var item in GetString())
Console.WriteLine("主线程: 子线程数据 = " + item);
}
static IEnumerable<int> GetNumbers()
{
// 以[0, 1, 2] 初始化数列 list
Console.WriteLine("初始化GetNumbers函数...");
List<int> list = new List<int>();
for (int i = 0; i < 3; i++)
list.Add(i);
// 每次 yield return 返回一个数据
Console.WriteLine("执行子线程...");//使用**yield 只从当前执行的位置继续执行**
yield return list[0];
yield return list[1];
yield return list[2];
Console.WriteLine("完成GetNumbers");
}
static IEnumerable<string> GetString()
{
Console.WriteLine("初始化GetString函数...");
List<string> list = new List<string>();
for (int i = 0; i < 3; i++)
list.Add("子项" + (i + 1));
Console.WriteLine("执行子线程...");
foreach (string str in list)//循环中使用**yield 也是只从当前执行的位置继续执行**
{
yield return str;
}
Console.WriteLine("完成GetString");
Console.ReadLine();
}
}
运行结果: