Learn C# Help

O Laço foreach: A Forma Simples de Iterar

Dentro do nosso universo de arrays, que imaginamos como uma fila de anões, o laço foreach é a ferramenta mais amigável e direta para se comunicar com eles. Pense nele como um anúncio geral feito por um alto-falante.

O anúncio diz: "Atenção, cada anão, um de cada vez, por favor, pegue uma tocha". Cada anão, em ordem, ouve a instrução e a executa. É simples, eficiente e não há como errar a ordem ou pular um anão.

O foreach foi projetado para uma única tarefa: percorrer uma coleção do início ao fim, elemento por elemento, de forma legível e segura.

Sintaxe e Funcionamento

A estrutura de um foreach é quase como uma frase em inglês:

foreach (Tipo variavel in colecao)

Vamos quebrar isso:

  • foreach: A palavra-chave que inicia o laço.

  • Tipo variavel: Você declara uma variável temporária que, a cada repetição (iteração), irá armazenar o valor do elemento atual. O Tipo deve ser compatível com os elementos da coleção.

  • in: A palavra-chave que conecta a variável à coleção.

  • colecao: O array (ou outra coleção) que você deseja percorrer.

string[] dwarves = { "Dopey", "Grumpy", "Doc", "Happy" }; // For each string, which we will call 'dwarf', in the 'dwarves' array... foreach (string dwarf in dwarves) { // The 'dwarf' variable holds the current element for this iteration Console.WriteLine($"{dwarf} is ready for work!"); } // Output: // Dopey is ready for work! // Grumpy is ready for work! // Doc is ready for work! // Happy is ready for work!

Vantagens

  1. Legibilidade: A sintaxe é muito clara sobre sua intenção. É mais fácil de ler e entender do que um laço for para a simples tarefa de percorrer uma coleção.

  2. Segurança: É impossível causar um erro de IndexOutOfRangeException com foreach, pois você não gerencia o índice manualmente. O laço cuida de começar no primeiro elemento e parar no último, sem erros.

  3. Simplicidade: Menos "peças móveis". Você não precisa inicializar um contador, verificar uma condição de parada ou incrementar o contador. Menos código significa menos chance de bugs.

Limitações e Cuidados Essenciais

A simplicidade do foreach vem com algumas regras estritas. Ignorá-las é uma fonte comum de erros.

1. Você Não Tem Acesso ao Índice

O foreach não sabe (e não te informa) a posição do elemento atual. Se você precisa fazer algo como "Na posição 3, faça isso", o foreach não é a ferramenta certa. Você precisará de um laço for.

2. A Coleção Não Pode Ser Modificada

Você não pode adicionar ou remover elementos de uma coleção enquanto um foreach está percorrendo-a. Isso é como tentar adicionar um anão no meio da fila enquanto o capataz está fazendo a contagem. Isso quebraria a lógica da iteração e, por isso, o C# lança uma exceção (InvalidOperationException).

// This code will COMPILE, but it will CRASH at runtime. var names = new List<string> { "Ana", "Beto" }; // Using a List to show modification foreach (string name in names) { if (name == "Ana") { // DON'T DO THIS! This will throw an InvalidOperationException. // names.Remove(name); } }

3. A Variável de Iteração é (Praticamente) Somente Leitura

Este é o ponto mais sutil e importante. Você não pode usar o foreach para alterar os valores dentro do seu array.

  • Para Tipos de Valor (int, bool, struct): A variável de iteração (dwarf, no nosso exemplo) é uma cópia do elemento no array. Mudar a cópia não afeta o original.

    int[] scores = { 10, 20, 30 }; foreach (int score in scores) { // 'score' is a COPY of the element in the array. // This line does NOT change the original array. It only changes the copy. // In fact, this line would cause a compile error because 'score' is read-only. // score = 100; // COMPILE ERROR! }
  • Para Tipos de Referência (objetos): A situação é um pouco diferente. A variável de iteração ainda é uma cópia, mas é uma cópia da referência (do endereço de memória). Isso significa que:

    • Você não pode fazer a variável apontar para um objeto totalmente novo.

    • Você pode usar a referência para acessar o objeto original e modificar suas propriedades.

    public class Dwarf { public string Name { get; set; } public bool HasPickaxe { get; set; } } Dwarf[] dwarves = { new Dwarf { Name = "Grumpy", HasPickaxe = false } }; foreach (Dwarf dwarf in dwarves) { // We CAN use the reference to modify a property of the object. dwarf.HasPickaxe = true; // This WORKS. The original object in the array is changed. // We CANNOT assign a completely new object to the iteration variable. // dwarf = new Dwarf { Name = "Happy", HasPickaxe = true }; // COMPILE ERROR! }

Conclusão: Quando Usar foreach?

Use o foreach sempre que sua intenção for percorrer todos os elementos de uma coleção para leitura ou para modificar propriedades de objetos de referência. É a sua escolha padrão para iteração simples pela sua legibilidade e segurança.

Se você precisar do índice, ou se precisar alterar os elementos de um array de tipos de valor (int, bool, etc.), use o laço for.

Referências

18 August 2025