延迟执行和惰性求值(LINQ to XML)

实现查询和轴操作通常是为了使用延迟执行。 本文介绍延迟执行的要求和优点,以及一些实现注意事项。

延迟执行

延迟执行意味着表达式的计算延迟,直到真正需要其实现值为止。 当需要操作大型数据集合时,延迟执行可以显著提高性能,尤其是在包含一系列链式查询或处理的程序中。 在最佳情况下,延迟执行仅允许通过源集合进行单个迭代。

LINQ 技术在核心 System.Linq 类的成员和各种 LINQ 命名空间中的扩展方法(例如 System.Xml.Linq.Extensions)中广泛使用延迟执行。

在 C# 语言中,yield(C# Reference) 关键字以语句的形式 yield-return 使用时,在迭代器块中可直接支持延迟执行。 此类迭代器必须返回类型 IEnumeratorIEnumerator<T> (或派生类型)的集合。

积极与迟缓计算

编写实现延迟执行功能的方法时,还必须决定是使用惰性求值还是立即求值来实现该方法。

  • 延迟计算中,每次调用迭代器时都会处理源集合的单个元素。 这是实现迭代器的典型方式。
  • 预先计算中,对迭代器的首次调用将导致处理整个集合。 可能还需要源集合的临时副本。 例如,该方法 OrderBy 必须先对整个集合进行排序,然后再返回第一个元素。

迟缓计算通常产生更好的性能,因为它将系统开销处理平均分配到整个集合的计算中,并将临时数据的使用降至最低。 当然,对于某些操作,除了将中间结果具体化之外,别无选择。

有关在 C# 和 Visual Basic 中对延迟执行进行编程的示例,请参阅 延迟执行示例

另请参阅