foreach, in (Referência em C#)foreach, in (C# reference)

A instrução foreach 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>.The foreach statement executes a statement or a block of statements for each element in an instance of the type that implements the System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> interface. A instrução foreach não está limitada a esses tipos e pode ser aplicada a uma instância de qualquer tipo que satisfaça as seguintes condições:The foreach statement is not limited to those types and can be applied to an instance of any type that satisfies the following conditions:

  • incluir um método GetEnumerator público sem parâmetros, cujo tipo de retorno é um tipo de classe, estrutura ou interface,has the public parameterless GetEnumerator method whose return type is either class, struct, or interface type,
  • o tipo de retorno do método GetEnumerator tem a propriedade Current pública e o método MoveNext público sem parâmetros, cujo tipo de retorno é Boolean.the return type of the GetEnumerator method has the public Current property and the public parameterless MoveNext method whose return type is Boolean.

A partir do C# 7.3, se a propriedade Current do enumerador retornar um valor retornado da referência (ref T, em que T é o tipo do elemento da coleção), será possível declarar a variável de iteração com o modificador ref ou ref readonly.Beginning with C# 7.3, if the enumerator's Current property returns a reference return value (ref T where T is the type of the collection element), you can declare the iteration variable with the ref or ref readonly modifier.

Em qualquer ponto dentro do bloco de instrução foreach, você pode sair do loop usando a instrução break ou seguir para a próxima iteração no loop usando a instrução continue.At any point within the foreach statement block, you can break out of the loop by using the break statement, or step to the next iteration in the loop by using the continue statement. Você também pode sair de um loop foreach com a instrução goto, return ou throw.You also can exit a foreach loop by the goto, return, or throw statements.

Se a instrução foreach for aplicada a null, uma NullReferenceException será gerada.If the foreach statement is applied to null, a NullReferenceException is thrown. Se a coleção de origem da instrução foreach estiver vazia, o corpo do loop foreach não será executado e será ignorado.If the source collection of the foreach statement is empty, the body of the foreach loop is not executed and skipped.

ExemplosExamples

Observação

Os exemplos de C# neste artigo são executados no executador de código embutido Try.NET e no playground.The C# examples in this article run in the Try.NET inline code runner and playground. Clique no botão Executar para executar um exemplo em uma janela interativa.Select the Run button to run an example in an interactive window. Ao executar o código, é possível modificá-lo e executar o código modificado clicando em Executar novamente.Once you execute the code, you can modify it and run the modified code by selecting Run again. O código modificado será executado na janela interativa ou, se a compilação falhar, a janela interativa exibirá todos as mensagens de erro do compilador C#.The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

O exemplo a seguir mostra o uso da instrução foreach com uma instância do tipo List<T> que implementa a interface IEnumerable<T>:The following example shows usage of the foreach statement with an instance of the List<T> type that implements the IEnumerable<T> interface:

var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 };
int count = 0;
foreach (int element in fibNumbers)
{
    count++;
    Console.WriteLine($"Element #{count}: {element}");
}
Console.WriteLine($"Number of elements: {count}");

O exemplo a seguir usa a instrução foreach com uma instância do tipo System.Span<T>, que não implementa nenhuma interface:The next example uses the foreach statement with an instance of the System.Span<T> type, which doesn't implement any interfaces:

public class IterateSpanExample
{
    public static void Main()
    {
        Span<int> numbers = new int[] { 3, 14, 15, 92, 6 };
        foreach (int number in numbers)
        {
            Console.Write($"{number} ");
        }
        Console.WriteLine();
    }
}

O exemplo a seguir usa uma variável de iteração ref para definir o valor de cada item em uma matriz stackalloc.The following example uses a ref iteration variable to set the value of each item in a stackalloc array. A versão ref readonly itera a coleção para imprimir todos os valores.The ref readonly version iterates the collection to print all the values. A declaração readonly usa uma declaração de variável local implícita.The readonly declaration uses an implicit local variable declaration. Declarações de variável implícita podem ser usadas com declarações ref ou ref readonly, assim como declarações de variável tipadas explicitamente.Implicit variable declarations can be used with either ref or ref readonly declarations, as can explicitly typed variable declarations.

public class ForeachRefExample
{
    public static void Main()
    {
        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
    }
}

Especificação da linguagem C#C# language specification

Para obter mais informações, confira a seção A instrução foreach na Especificação da linguagem C#.For more information, see The foreach statement section of the C# language specification.

Consulte tambémSee also