我想知道使用yield return而不是返回列表是否存在任何并发(现在或将来)或性能优势.请参阅以下示例
处理方法
void Page_Load() { foreach(var item in GetPostedItems()) Process(item); }
使用收益率回报
IEnumerableGetPostedItems() { yield return Item1.Text; yield return Item2.Text; yield return Item3.Text; }
返回一个清单
IEnumerableGetPostedItems() { var list = new List (); list.Add(Item1.Text); list.Add(Item2.Text); list.Add(Item3.Text); return list; }
Jeff Yates.. 40
在该yield return
示例中,在每次调用时评估结果,IEnumerable.MoveNext
而在列表示例中,在IEnumerable
返回之前评估所有结果(请注意,Text
可能不会为每个结果评估属性,因为可以进行缓存和内联).因此,yield return
您应该在第一次调用枚举器时获得较小的性能增强,然后在IEnumerable.MoveNext
评估属性时对每次后续调用可能会略微降低性能.
其中一个重要的事情yield return
是,您可以返回无限序列,随机序列和各种其他新颖的枚举,这些枚举要么是效率极低,要么无法使用先创建列表的模型.
简单地说,返回一个实例List
需要在返回之前评估列表中的所有元素IEnumerable
,而using yield return
允许按照消费者的需要计算每个元素IEnumerable
.
在该yield return
示例中,在每次调用时评估结果,IEnumerable.MoveNext
而在列表示例中,在IEnumerable
返回之前评估所有结果(请注意,Text
可能不会为每个结果评估属性,因为可以进行缓存和内联).因此,yield return
您应该在第一次调用枚举器时获得较小的性能增强,然后在IEnumerable.MoveNext
评估属性时对每次后续调用可能会略微降低性能.
其中一个重要的事情yield return
是,您可以返回无限序列,随机序列和各种其他新颖的枚举,这些枚举要么是效率极低,要么无法使用先创建列表的模型.
简单地说,返回一个实例List
需要在返回之前评估列表中的所有元素IEnumerable
,而using yield return
允许按照消费者的需要计算每个元素IEnumerable
.