系统一旦碰到yield就会返回后面的值,而不是等到所有的值都生成完毕才返回,这对提高系统性能有好处,比如如下两段代码
IEnumerable<string> GetNames()
{
for(int i=0;i<1000000000000000000000000000000000000;i++)
{
yield return i.toString();
}
}
和
IEnumerable<string> GetNames()
{
List<string> result = new List<string>();
for(int i=0;i<1000000000000000000000000000000000000;i++)
{
result.Add(i.toString());
}
return result;
}
这2段代码所返回的结果是完全一样的,不同的是第一段使用yield的代码会马上一个一个地返回i.toString(),用户看不到有什么停顿,而且对内存的开销极小。但是第二段代码系统会生成所有的array之后才会返回这个array值。时间会很长,用户会明显感觉到有停顿
,并且需要大量的内存记住这个返回的array值
这就是用yield的好处,可以立即的、实时的处理foreach里面的items。
IEnumerable<string> GetNames()
{
for(int i=0;i<1000000000000000000000000000000000000;i++)
{
yield return i.toString();
}
}
和
IEnumerable<string> GetNames()
{
List<string> result = new List<string>();
for(int i=0;i<1000000000000000000000000000000000000;i++)
{
result.Add(i.toString());
}
return result;
}
这2段代码所返回的结果是完全一样的,不同的是第一段使用yield的代码会马上一个一个地返回i.toString(),用户看不到有什么停顿,而且对内存的开销极小。但是第二段代码系统会生成所有的array之后才会返回这个array值。时间会很长,用户会明显感觉到有停顿
,并且需要大量的内存记住这个返回的array值
这就是用yield的好处,可以立即的、实时的处理foreach里面的items。