C# - Foreach versus For/Next
Se você ainda fica um pouco confuso quando deve usar um for/next ou um foreach neste artigo vamos comparar essas duas estruturas de repetições usadas para iterar sobre itens e coleções.

Neste artigo vamos comparar as estruturas de repetição 'for' e 'foreach' tanto no quesito de funcionamento básico como no desempenho focando na iteração de listas ou coleções.

Laço For

A instrução for executa uma instrução ou um bloco de instruções enquanto uma expressão booleana especificada é avaliada como true, ou seja, ou seja, o laço for itera até que uma condição seja verdadeira.

Você fornece uma instrução inicial (inicializador), uma condição para a qual o laço deve ser iterado até que ele seja falso, um iterador,  e, uma instrução que será executada após cada execução bem-sucedida do bloco.

A estrutura da instrução for é a seguinte:

for (inicializador; condição; iterador)
    instrução
 

Um exemplo básico e padrão para um laço for seria:

for (int index = 1; index < 10; index++)
{
      Console.WriteLine(index)

}

Um exemplo de código usando uma coleção ou lista seria:

using System;
using System.Collections.Generic;
namespace CSharp_For1
{
    class Aluno
    {
        public string Nome { get; set; }
        public int Idade { get; set; }
        public static List<Aluno> GetAlunos()
        {
            List<Aluno> alunos = new List<Aluno>();
            alunos.Add(new Aluno { Nome = "Pedro", Idade = 20 });
            alunos.Add(new Aluno { Nome = "Maria", Idade = 18 });
            return alunos;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Aluno> lista = Aluno.GetAlunos();
            for (int index = 0; index < lista.Count; index++)
            {
                Console.WriteLine(lista[index].Nome);
            }
        }
    }
}

Observe que podemos acessar diretamente o item da lista pelo seu índice. ( lista[index].Nome )

Laço Foreach

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>.

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:

1 - Incluir um método GetEnumerator público sem parâmetros, cujo tipo de retorno é um tipo de classe, estrutura ou interface;

2 - 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.

De forma geral a instrução Foreach é usada para iterar sobre itens em uma coleção (List, Arrays, etc,)

Usando o mesmo exemplo anterior para o laço foreach para iterar sobre uma lista temos:

using System;
using System.Collections.Generic;
namespace CSharp_For1
{
    class Aluno
    {
        public string Nome { get; set; }
        public int Idade { get; set; }
        public static List<Aluno> GetAlunos()
        {
            List<Aluno> alunos = new List<Aluno>();
            alunos.Add(new Aluno { Nome = "Pedro", Idade = 20 });
            alunos.Add(new Aluno { Nome = "Maria", Idade = 18 });
            return alunos;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var alunos = Aluno.GetAlunos();
            foreach (Aluno aluno in alunos)
            {
                Console.WriteLine(aluno.Nome);
            }
            Console.ReadLine();
        }     
    }
}

Esse código esconde alguns segredos.

O laço foreach cria uma cópia da coleção na qual estamos iterando e isso significa que se você desejar realizar uma atribuição em um item da coleção não vai poder fazer isso diretamente.

Para deixar mais claro veja este exemplo :

Como foreach cria uma cópia da coleção, o elemento 'item' não esta referenciando os elementos do array, ele é apenas uma variável temporária e não podemos atribuir um valor a ele.

A conclusão é que em termos de desempenho o laço foreach é mais lento que um laço for pois ele usa mais memória e usa os métodos GetEnumerator() e Next().

Para acessar coleções a sintaxe do foreach é mais legível, limpa e menos sucetível a erros, mas na maioria dos cenários o laçor for é mais rápido.

É claro que na vida real os cenários podem ser mais complexos e a escolha pode ser diferente. Se você precisar do índice do item que esta sendo iterado, até o momento o foreach não te fornece o índice, mas o for oferece.

E se o que você esta iterando não for uma coleção então o laço for é mais indicado pois esta fazendo uma contagem sendo mais rápido.

E estamos conversados...

"Bom é louvar ao SENHOR, e cantar louvores ao teu nome, ó Altíssimo;
Para de manhã anunciar a tua benignidade, e todas as noites a tua fidelidade;"
Salmos 92:1,2

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?


Referências:


José Carlos Macoratti