Analise o código C# mostrado abaixo.namespace ConsoleApplica...
namespace ConsoleApplication1
{
class Program
{
static IEnumerable<int>
XPTO(int from, int to) {
for (int i = from; i < to; i+=3) {
yield return i;
}
yield break;
}
static void Main()
{
foreach (int x in XPTO(-10, 10) {
Console.WriteLine(x);
}
}
}
}
O resultado exibido pelo programa é:
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Resposta Correta: B -10, -7, -4, -1, 2, 5, 8
O código apresentado na questão é um exemplo de implementação de um iterador em C# utilizando a palavra-chave yield. Iteradores são construções que permitem a iteração sobre uma coleção sem a necessidade de criar uma coleção temporária, como uma lista ou array, economizando memória e tempo de execução.
A função XPTO declarada retorna uma sequência de números inteiros (IEnumerable<int>) que começa no valor especificado pelo parâmetro from e termina antes de alcançar o valor especificado pelo parâmetro to. Dentro do loop for, a expressão yield return i; é usada para retornar o valor atual de i a cada iteração. Após cada yield return, o estado da função é mantido, e o loop continua até sua próxima execução. O yield break é utilizado para encerrar a geração de valores, mas no presente caso, é redundante visto que o loop for já define a condição de término.
O loop começa com o valor de i igual ao parâmetro from (que é -10) e incrementa i por 3 a cada iteração (i+=3). Portanto, a sequência gerada será: -10, -7, -4, -1, 2, 5, 8. Observe que o valor 8 é o último valor gerado, pois o próximo valor seria 11, que não é menor que o parâmetro to (que é 10), portanto, o loop termina antes de i alcançar 11. Assim, a alternativa correta é a B, pois ela lista exatamente a sequência de números que seriam impressos na tela pelo programa.
Para resolver essa questão com sucesso, é importante ter um bom entendimento de como funcionam os iteradores em C#, a sintaxe do loop for, e o significado das palavras-chave yield return e yield break.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
from = -10
to = 10
não pode esquecer que começa imprimindo o -10, por isso errei na prova.
quando i = 11 -> i+=3 -> 8+3
11 < 10 ? sai do loop e entra no break. Por isso a impressão termina no 8
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo