Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Instruções de iteração –
Use instruções de iteração para executar repetidamente uma instrução ou um bloco de instruções. A instrução for executa o bloco correspondente enquanto uma expressão booliana especificada é avaliada como true. A foreach instrução enumera os elementos de uma coleção e executa o seu bloco de código para cada um dos elementos da coleção. A instrução do executa condicionalmente o bloco correspondente uma ou mais vezes. A instrução while executa condicionalmente o bloco correspondente zero ou mais vezes.
A qualquer momento dentro do corpo de uma instrução de iteração, você pode sair do loop usando a break instrução. Você pode passar para a próxima iteração no loop usando a continue instrução.
A linguagem C# faz referência a documentos da versão mais recentemente lançada da linguagem C#. Ele também contém a documentação inicial para recursos em visualizações públicas para a próxima versão do idioma.
A documentação identifica qualquer recurso introduzido pela primeira vez nas três últimas versões do idioma ou nas versões prévias públicas atuais.
Dica
Para descobrir quando um recurso foi introduzido pela primeira vez em C#, consulte o artigo sobre o histórico de versão da linguagem C#.
A instrução for
A for instrução executa uma instrução ou um bloco de instruções enquanto uma expressão booliana especificada é avaliada como true. O seguinte exemplo mostra a instrução for que executa o corpo dela enquanto um contador inteiro é menor que três:
for (int i = 0; i < 3; i++)
{
Console.Write(i);
}
// Output:
// 012
O exemplo anterior mostra os elementos da instrução for:
A seção inicializador que é executada apenas uma vez, antes de inserir o loop. Normalmente, você declara e inicializa uma variável de loop local nessa seção. Você não pode acessar a variável declarada de fora da
forinstrução.A seção inicializador no exemplo anterior declara e inicializa uma variável de contador inteiro:
int i = 0A seção de condição que determina se a próxima iteração no loop deve ser executada. Se ele for avaliado
trueou não estiver presente, a próxima iteração será executada. Caso contrário, o loop será encerrado. A seção condição deve ser uma expressão booliana.A seção de condição no exemplo anterior verifica se um valor de contador é menor que três:
i < 3A seção iterador que define o que acontece após cada execução do corpo do loop.
A seção iterador no exemplo anterior incrementa o contador:
i++O corpo do loop, que deve ser uma declaração ou um bloco de declarações.
A seção iterador pode conter zero ou mais das seguintes expressões de instrução, separadas por vírgulas:
- prefixo ou sufixo da expressão incrementar, como
++ioui++ - prefixo ou sufixo da expressão decrementar, como
--ioui-- - designação
- invocação de um método
-
awaitexpressão - criação de um objeto usando o
newoperador
Se você não declarar uma variável de loop na seção inicializador, poderá usar zero ou mais das expressões da lista anterior na seção inicializador também. O exemplo a seguir mostra vários usos menos comuns das seções inicializador e iterador: atribuir um valor a uma variável externa na seção inicializador, invocar um método nas seções inicializador e iterador e alterar os valores de duas variáveis na seção do iterador:
int i;
int j = 3;
for (i = 0, Console.WriteLine($"Start: i={i}, j={j}"); i < j; i++, j--, Console.WriteLine($"Step: i={i}, j={j}"))
{
//...
}
// Output:
// Start: i=0, j=3
// Step: i=1, j=2
// Step: i=2, j=1
Todas as seções da for instrução são opcionais. Por exemplo, o código a seguir define o loop infinito for :
for ( ; ; )
{
//...
}
A instrução foreach
A foreach instrução executa uma instrução ou um bloco de instruções para cada elemento em uma instância do tipo que implementa a interface System.Collections.IEnumerable ou System.Collections.Generic.IEnumerable<T>, como mostra o exemplo a seguir:
List<int> fibNumbers = new() { 0, 1, 1, 2, 3, 5, 8, 13 };
foreach (int element in fibNumbers)
{
Console.Write($"{element} ");
}
// Output:
// 0 1 1 2 3 5 8 13
A declaração foreach não está limitada a esses tipos. Você pode usá-lo com uma instância de qualquer tipo que atenda às seguintes condições:
- Um tipo tem o método público sem parâmetros
GetEnumerator. OGetEnumeratormétodo pode ser um método de extensão. - O tipo de retorno do
GetEnumeratormétodo tem a propriedade públicaCurrente o método público semMoveNextparâmetros cujo tipo de retorno ébool.
O exemplo a seguir usa a foreach instrução com uma instância do System.Span<T> tipo, que não implementa nenhuma interface:
Span<int> numbers = [3, 14, 15, 92, 6];
foreach (int number in numbers)
{
Console.Write($"{number} ");
}
// Output:
// 3 14 15 92 6
Se a propriedade do Current enumerador retornar um valor de retorno de referência (ref T onde T é o tipo de um elemento de coleção), você poderá declarar uma variável de iteração com o modificador ref ou ref readonly, como o exemplo a seguir mostra:
Span<int> storage = stackalloc int[10];
int num = 0;
foreach (ref int item in storage)
{
item = num++;
}
foreach (ref readonly var item in storage)
{
Console.Write($"{item} ");
}
// Output:
// 0 1 2 3 4 5 6 7 8 9
Se a coleção de origem da foreach instrução estiver vazia, o foreach corpo da instrução não será executado e ignorado. Se a instrução foreach for aplicada a null, uma NullReferenceException será gerada.
await foreach
Use a await foreach instrução para consumir um fluxo assíncrono de dados, ou seja, um tipo de coleção que implementa a IAsyncEnumerable<T> interface. Cada iteração do loop pode ser suspensa enquanto o próximo elemento é recuperado de forma assíncrona. O exemplo a seguir mostra como usar a await foreach instrução:
await foreach (var item in GenerateSequenceAsync())
{
Console.WriteLine(item);
}
Você também pode usar a instrução await foreach com uma instância de qualquer tipo que atenda às seguintes condições:
- Um tipo tem o método público sem parâmetros
GetAsyncEnumerator. Esse método pode ser um membro de extensão. - O tipo de retorno do método
GetAsyncEnumeratortem a propriedade públicaCurrente o método público sem parâmetrosMoveNextAsync, cujo tipo de retorno éTask<bool>,ValueTask<bool>ou qualquer outro tipo aguardável cujo métodoGetResultdo awaiter retorna um valorbool.
Por padrão, a instrução await foreach processa elementos de fluxo no contexto capturado. Se você quiser desabilitar a captura do contexto, use o TaskAsyncEnumerableExtensions.ConfigureAwait método de extensão. Para obter mais informações sobre contextos de sincronização e captura do contexto atual, consulte Consumindo o padrão assíncrono baseado em tarefa. Para obter mais informações sobre fluxos assíncronos, consulte o tutorial de fluxos assíncronos.
Tipo de uma variável de iteração
Use a var palavra-chave para permitir que o compilador infera o tipo de uma variável de iteração na foreach instrução, como mostra o código a seguir:
foreach (var item in collection) { }
Observação
O compilador pode inferir o tipo de uma var declaração como um tipo de referência anulável, dependendo se o contexto de reconhecimento anulável está habilitado e se o tipo de uma expressão de inicialização é um tipo de referência.
Para obter mais informações, consulte variáveis locais de tipo implícito.
Você também pode especificar explicitamente o tipo de uma variável de iteração, como mostra o código a seguir:
IEnumerable<T> collection = new T[5];
foreach (V item in collection) { }
No formulário anterior, o tipo T de elemento de coleção deve ser implicitamente ou explicitamente conversível para o tipo V de uma variável de iteração. Se uma conversão explícita de T para V falhar em tempo de execução, a instrução foreach lança um InvalidCastException. Por exemplo, se T for um tipo de classe não lacrado, V pode ser qualquer tipo de interface, mesmo aquele que T não implementa. Em tempo de execução, o tipo de elemento de coleção pode ser aquele que T deriva e realmente implementa V. Se esse não for o caso, o erro InvalidCastException é gerado.
A instrução do
A do instrução executa uma instrução ou um bloco de instruções enquanto uma expressão booliana especificada é avaliada como true. Como o loop avalia essa expressão após cada execução, um do loop é executado uma ou mais vezes. O do loop difere do while loop, que executa zero ou mais vezes.
O exemplo a seguir mostra o uso da do instrução:
int n = 0;
do
{
Console.Write(n);
n++;
} while (n < 5);
// Output:
// 01234
A instrução while
A while instrução executa uma instrução ou um bloco de instruções enquanto uma expressão booliana especificada é avaliada como true. Como o loop avalia essa expressão antes de cada execução, um while loop executa zero ou mais vezes. O while loop é diferente do do loop, que é executado uma ou mais vezes.
O exemplo a seguir mostra o uso da while instrução:
int n = 0;
while (n < 5)
{
Console.Write(n);
n++;
}
// Output:
// 01234
Especificação da linguagem C#
Para obter mais informações, confira as seguintes seções da especificação da linguagem C#:
-
A instrução
for -
A instrução
foreach -
A instrução
do -
A instrução
while -
Suporte à extensão
GetEnumeratorpara loopsforeach