Sabe aquele Yield return que está no código fonte do Linq que voce achou interessante mas nunca utilizou? Pois bem, economiza memória, mais performático e clean.

Os dois códigos abaixo fazem a mesma coisa, recebem um range gigante de números e retorna um IEnumerable de números pares:

Sem Yield return

Com Yield return

Veja agora o impacto no consumo de memória!

Utilizando yield return são consumidos apenas 2,82Mb enquanto o retorno sem o yield return consumiram incríveis 3,4Gb!

Observe que como o yield return é uma máquina de estado, o seu tempo de execução é maior (19s com yield e 16s sem yield).

O Yield return é um sintaxe sugar para controlar um fluxo de dados. Quando yield return é compilado ele é transformado em uma máquina de estado, que permite controlar o fluxo de dados, retornando elementos sem sair do método. Ao invés de adicionarmos elementos em uma lista que é retornada posteriormente, retornamos elementos em sequencia.

Na prática, apenas um elemento pode ser retornado, porém nesse cenário é um overhead, por isso o uso do yield return é recomendado para grande quantidade de elementos.

Confira o exemplo completo no GitHub: Yield return no Github