Partilhar via


Execução adiada e avaliação preguiçosa (LINQ to XML)

As operações de consulta e eixo geralmente são implementadas para usar a execução adiada. Este artigo explica os requisitos e as vantagens da execução diferida e algumas considerações sobre a implementação.

Execução diferida

A execução diferida significa que a avaliação de uma expressão é adiada até que seu valor realizado seja realmente necessário. A execução adiada pode melhorar muito o desempenho quando você precisa manipular grandes coleções de dados, especialmente em programas que contêm uma série de consultas ou manipulações encadeadas. Na melhor das hipóteses, a execução adiada permite apenas uma única iteração através da coleção de origem.

As tecnologias LINQ fazem uso extensivo da execução diferida nos membros das classes principais System.Linq e nos métodos de extensão nos vários namespaces LINQ, como System.Xml.Linq.Extensions.

A execução adiada é suportada diretamente na linguagem C# pela palavra-chave yield (C# Reference) (na forma da instrução) quando usada dentro de um bloco iterador yield-return . Esse iterador deve retornar uma coleção de tipo IEnumerator ou IEnumerator<T> (ou um tipo derivado).

Avaliação ansiosa versus preguiçosa

Quando você escreve um método que implementa a execução adiada, você também tem que decidir se implementa o método usando avaliação preguiçosa ou avaliação ansiosa.

  • Na avaliação preguiçosa, um único elemento da coleção de origem é processado durante cada chamada para o iterador. Esta é a maneira típica pela qual os iteradores são implementados.
  • Na avaliação ansiosa, a primeira chamada para o iterador resultará em toda a coleção sendo processada. Uma cópia temporária da coleção de origem também pode ser necessária. Por exemplo, o OrderBy método tem que classificar toda a coleção antes de retornar o primeiro elemento.

A avaliação preguiçosa geralmente produz um melhor desempenho porque distribui o processamento de despesas gerais uniformemente ao longo da avaliação da coleção e minimiza o uso de dados temporários. É claro que, para algumas operações, não há outra opção a não ser materializar resultados intermediários.

Consulte Exemplo de execução adiada para obter um exemplo de programação de execução adiada em C# e Visual Basic.

Consulte também