Olá, Diego. Como vai?
Sua análise sobre a legibilidade do código está totalmente correta! O laço foreach é a melhor escolha quando precisamos apenas percorrer todos os elementos de uma coleção do início ao fim, sem a necessidade de manipular, pular ou alterar os índices do array. Ele deixa o código limpo, expressivo e livre de erros clássicos de estouro de escopo (como o famoso IndexOutOfRangeException).
A sua implementação da lógica de acumulação (totalDoacoes += doacao) funcionou perfeitamente e a formatação da moeda usando o ToString("F2") para garantir duas casas decimais foi uma excelente prática de exibição.
Para agregar ainda mais valor aos seus estudos e expandir seu repertório em C#, gostaria de compartilhar duas alternativas excelentes para lidar com somatórios de arrays:
1. A Abordagem Moderna com LINQ (Apenas uma linha)
No dia a dia do desenvolvimento C#, é muito comum simplificarmos loops de somatórios utilizando o LINQ (System.Linq). Existe um método de extensão chamado Sum() feito exclusivamente para isso.
Com ele, você elimina a necessidade de criar a variável acumuladora e o laço foreach manualmente:
using System.Linq;
double[] doacoes = { 51.10, 35.66, 500.12, 100, 712.59 };
// O método Sum() faz todo o trabalho de iteração e soma por baixo dos panos
double totalDoacoes = doacoes.Sum();
Console.WriteLine($"O total em doações foi de: R${totalDoacoes.ToString("F2")}");
2. Quando o loop for tradicional ainda é vantajoso?
Como você bem mencionou, o foreach brilha quando o índice não é necessário. Mas vale a pena lembrar em quais cenários o for convencional (com a variável i) seria preferível:
- Se você precisasse somar apenas os valores que estão em posições pares do array.
- Se você precisasse interromper a soma ao atingir um determinado teto (ex: parar de somar após o total passar de R$ 1000,00 e descobrir em qual índice isso aconteceu).
- Se você precisasse modificar o valor de algum elemento do array durante a leitura (o
foreach cria uma variável de leitura que não permite alteração direta do item original).
(Apenas um pequeno detalhe de digitação no seu array original: o número 500,12 foi escrito com vírgula em vez de ponto 500.12. No C#, a vírgula serve para separar os elementos do array, então o compilador acabou interpretando como dois números separados: 500 e 12. Ajustando para o ponto decimal, o cálculo funcionará com precisão!).
Parabéns pelo raciocínio limpo e focado em legibilidade de código!
Espero que possa ter lhe ajudado!