并发或性能返回列表时yield收益的好处

我想知道使用yield return而不是返回列表是否存在任何并发(现在或将来)或性能优势。 请参阅以下示例

处理方法

void Page_Load() { foreach(var item in GetPostedItems()) Process(item); } 

使用收益率回报

 IEnumerable GetPostedItems() { yield return Item1.Text; yield return Item2.Text; yield return Item3.Text; } 

返回一个清单

 IEnumerable GetPostedItems() { var list = new List(); list.Add(Item1.Text); list.Add(Item2.Text); list.Add(Item3.Text); return list; } 

yield return示例中,在IEnumerable.MoveNext每次调用中计算结果,而在列表示例中,在返回IEnumerable之前评估所有结果(请注意,可能不会为每个结果评估Text属性,因为缓存和内联可以发生)。 因此,对于yield return您应该在第一次调用枚举器时获得较小的性能增强,然后在评估属性时对IEnumerable.MoveNext每次后续调用可能会IEnumerable.MoveNext降低性能。

yield return就是你可以返回无限序列,随机序列和各种其他新颖的枚举,这些枚举要么是效率极低,要么不能用于首先创建列表的模型。

简单地说,返回List的实例要求在返回IEnumerable之前评估列表中的所有元素,而使用yield return允许按照IEnumerable的使用者的要求计算每个元素。