Ejecución y evaluación diferidas (LINQ to XML)

Las operaciones de consulta y de eje a menudo se implementan para usar la ejecución aplazada. Este artículo describe los requisitos y las ventajas de la ejecución aplazada, y algunas consideraciones acerca de la implementación.

Ejecución diferida

La ejecución aplazada significa que la evaluación de una expresión se retrasa hasta que su valor realizado sea realmente necesario. La ejecución aplazada puede mejorar considerablemente el rendimiento cuando deba manipular grandes recolecciones de datos, sobre todo en programas que contengan una serie de manipulaciones o consultas encadenadas. En el mejor de los casos, la ejecución aplazada solo habilita una iteración a través de la recolección de origen.

Las tecnologías LINQ usan intensivamente la ejecución aplazada tanto en los miembros de las clases System.Linq principales como en los métodos de extensión de los diversos espacios de nombres LINQ, por ejemplo, System.Xml.Linq.Extensions.

El lenguaje C# admite directamente la ejecución aplazada mediante la palabra clave yield (referencia de C#) (en forma de instrucción yield-return) cuando se usa en un bloque de iteradores. Este tipo de iterador debe devolver una colección de tipo IEnumerator o IEnumerator<T> (o bien un tipo derivado).

Diferencias entre la evaluación diligente y la evaluación diferida

Al escribir un método que implemente una ejecución aplazada, también debe decidir si implementa el método con la evaluación diferida o la evaluación diligente.

  • En la evaluación diferida, un único elemento de la colección de origen se procesa durante cada llamada al iterador. Esta es la forma habitual en la que se implementan los iteradores.
  • En la evaluación diligente, la primera llamada al iterador hará que se procese toda la colección. Es posible que también se requiera una copia temporal de la colección de origen. Por ejemplo, el método OrderBy debe ordenar toda la colección antes de devolver el primer elemento.

Normalmente, la evaluación diferida presenta un mejor rendimiento, ya que distribuye el procesamiento de sobrecarga de forma equitativa durante la evaluación de la colección y minimiza el uso de los datos temporales. Obviamente, para algunas operaciones, no existe otra alternativa que materializar resultados intermedios.

Consulte Ejemplo de ejecución diferida para obtener un ejemplo de programación de una ejecución diferida en C# y Visual Basic.

Consulte también