Notei algo interessante. Posso alterar os elementos do array ou atribuir uma nova referência de array em blocos foreach, mas não posso fazer as mesmas operações com coleções, dá erro. Por quê?? O exemplo a seguir dá erro
List<string> isimler = new List<string>() { "Ali", "Ayşe", "Fatma", "Mehmet" };
foreach (var (isim, index) in isimler.Select((isim, index) => (isim, index)))
{
isimler[index] += 10;
}
foreach(string isim in isimler)
{
Console.WriteLine(isim);
}
O exemplo a seguir não dá erro, está funcionando
string[] isimler = { "Ali", "Ayşe", "Fatma", "Mehmet" };
foreach (var (isim, index) in isimler.Select((isim, index) => (isim, index)))
{
isimler[index] += 10;
}
foreach(string isim in isimler)
{
Console.WriteLine(isim);
}
Porque listas têm código para rastreamento explícito para isso (alterando um inteiro de rastreamento toda vez que você faz uma alteração por meio da API de lista), e arrays não. No caso de listas, isso é especialmente importante porque se você adicionar ou remover elementos, isso pode impactar significativamente o comportamento do loop (imagine remover o elemento zero, por exemplo). Como você não pode adicionar/remover com arrays, isso é menos preocupante, e arrays são concebidos como tipos de dados muito brutos, sem a sobrecarga de tais campos de rastreamento adicionais.
Acontece que há APIs que você pode usar
List<T>
para que essa mudança específica não seja notada . Isso não torna uma boa ideia fazer isso!e se você fosse fazer isso: seria muito mais eficiente:
No fim das contas, em qualquer dos casos, se o conteúdo de algo está mudando enquanto você olha para ele : algo arriscado está acontecendo, independentemente de ser notado ou não .
O comportamento de
List
é mais um detalhe de implementação (embora seja uma boa ideia na maior parte do tempo -Add/Remove
preocupações entre muitas coisas, como descreve a resposta de Mark Gravell).A fonte mais oficial que consegui encontrar sobre o assunto afirma que:
Então, listas lançam exceções, arrays não. Nada realmente impede você de fazer uma coleção que implementa
IEnumerable
e se comporta como um array wrt para modificação, mas comoList
quando você tenta adicionar ou remover elementos (lançando exceções).